create.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <template>
  2. <hc-card scrollbar is-action-btn class="create-project">
  3. <template #header>
  4. <div class="flex-1 text-center text-[24px] font-bold">项目信息填写</div>
  5. </template>
  6. <el-form :model="baseForm" label-width="auto" :rules="baseFormRules" size="large" label-position="left">
  7. <el-row :gutter="20">
  8. <el-col :span="12">
  9. <el-form-item label="项目名称:" prop="key1">
  10. <el-input v-model="baseForm.key1" placeholder="请输入" clearable />
  11. </el-form-item>
  12. </el-col>
  13. <el-col :span="12">
  14. <el-form-item label="建设规模:" prop="key2">
  15. <el-input v-model="baseForm.key2" placeholder="请输入" clearable>
  16. <template #append>
  17. <el-select v-model="unitSelect" placeholder="单位" style="width: 80px">
  18. <el-option label="公里" value="1" />
  19. <el-option label="无" value="2" />
  20. </el-select>
  21. </template>
  22. </el-input>
  23. </el-form-item>
  24. </el-col>
  25. <el-col :span="6">
  26. <el-form-item label="项目阶段:" prop="key3">
  27. <el-select v-model="baseForm.key3" placeholder="请选择">
  28. <el-option v-for="item in stateOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  29. </el-select>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="6">
  33. <el-form-item label="项目类型:" prop="key4">
  34. <el-select v-model="baseForm.key4" placeholder="请选择">
  35. <el-option v-for="item in typeOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  36. </el-select>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="6">
  40. <el-form-item label="总投资:" prop="key111">
  41. <el-input
  42. v-model="yearForm.key111" placeholder="请输入" clearable
  43. :formatter="formatInput"
  44. >
  45. <template #append>亿元</template>
  46. </el-input>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="6">
  50. <el-form-item label="十四五计划投资:" prop="key112">
  51. <el-input
  52. v-model="yearForm.key112" placeholder="请输入" clearable
  53. :formatter="formatInput"
  54. >
  55. <template #append>亿元</template>
  56. </el-input>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="6">
  60. <el-form-item label="开工年:" prop="key5">
  61. <el-date-picker ref="startYearRef" v-model="baseForm.key5" class="block" type="year" placeholder="请选择" value-format="YYYY" @change="startYearChange" />
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="6">
  65. <el-form-item label="完工年:" prop="key6">
  66. <el-date-picker ref="endYearRef" v-model="baseForm.key6" class="block" type="year" placeholder="请选择" value-format="YYYY" @change="endYearChange" @blur="endYearBlur" />
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="6">
  70. <el-form-item label="市级重点项目:" prop="kekey33">
  71. <el-select v-model="baseForm.key33" placeholder="请选择">
  72. <el-option v-for="item in stateOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  73. </el-select>
  74. </el-form-item>
  75. </el-col>
  76. <el-col :span="6">
  77. <el-form-item label="交通强国建设试点任务:" prop="key44">
  78. <el-select v-model="baseForm.key44" placeholder="请选择">
  79. <el-option v-for="item in typeOptions" :key="item.id" :label="item.dictValue" :value="item.id" />
  80. </el-select>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :span="8">
  84. <el-form-item label="牵头单位:" prop="key7">
  85. <el-input v-model="baseForm.key7" placeholder="请输入" clearable type="textarea" />
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="8">
  89. <el-form-item label="配合单位:" prop="key8">
  90. <el-input v-model="baseForm.key7" placeholder="请输入" clearable type="textarea" />
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="8">
  94. <el-form-item label="责任单位:" prop="key9">
  95. <el-input v-model="baseForm.key7" placeholder="请输入" clearable type="textarea" />
  96. </el-form-item>
  97. </el-col>
  98. </el-row>
  99. </el-form>
  100. <hc-card-item class="year-detail mt-3">
  101. <template #header>
  102. <el-select v-model="selectYear" placeholder="选择年份" class="select-year w-[100px]">
  103. <el-option v-for="item in yearOptions" :key="item.value" :label="item.label" :value="item.value" />
  104. </el-select>
  105. </template>
  106. <el-form :model="yearForm" label-width="auto" :rules="yearFormRules" class="mt-3" label-position="left" size="large">
  107. <el-form-item label="全年计划投资:" prop="key1" class="w-100">
  108. <el-input
  109. v-model="yearForm.key1" placeholder="请输入" clearable
  110. :formatter="formatInput"
  111. >
  112. <template #append>亿元</template>
  113. </el-input>
  114. </el-form-item>
  115. <el-form-item label="预计完成投资额:" prop="key1">
  116. <div class="quarter-box w-full flex">
  117. <div class="flex">
  118. <el-input v-model="yearForm.key2" placeholder="请输入" clearable :formatter="formatInput">
  119. <template #prepend>一季度</template>
  120. <template #append>亿元</template>
  121. </el-input>
  122. </div>
  123. <div class="ml-[40px] flex">
  124. <el-input v-model="yearForm.key3" placeholder="请输入" clearable :formatter="formatInput">
  125. <template #prepend>二季度</template>
  126. <template #append>亿元</template>
  127. </el-input>
  128. </div>
  129. <div class="ml-[40px] flex">
  130. <el-input v-model="yearForm.key4" placeholder="请输入" clearable :formatter="formatInput">
  131. <template #prepend>三季度</template>
  132. <template #append>亿元</template>
  133. </el-input>
  134. </div>
  135. <div class="ml-[40px] flex">
  136. <el-input v-model="yearForm.key5" placeholder="请输入" clearable :formatter="formatInput">
  137. <template #prepend>四季度</template>
  138. <template #append>亿元</template>
  139. </el-input>
  140. </div>
  141. </div>
  142. </el-form-item>
  143. <el-form-item label="全年目标:" prop="key6">
  144. <el-input v-model="yearForm.key6" placeholder="请输入" clearable type="textarea" />
  145. </el-form-item>
  146. </el-form>
  147. <el-form :model="yearForm" label-width="auto" :rules="yearFormRules" class="mt-3" label-position="left">
  148. <div class="hc-form-item-title">各季度工作计划:</div>
  149. <el-form-item label="一季度:" prop="key7">
  150. <el-input v-model="yearForm.key7" placeholder="请输入" clearable type="textarea" />
  151. </el-form-item>
  152. <el-form-item label="二季度:" prop="key8">
  153. <el-input v-model="yearForm.key8" placeholder="请输入" clearable type="textarea" />
  154. </el-form-item>
  155. <el-form-item label="三季度:" prop="key8">
  156. <el-input v-model="yearForm.key8" placeholder="请输入" clearable type="textarea" />
  157. </el-form-item>
  158. <el-form-item label="四季度:" prop="key10">
  159. <el-input v-model="yearForm.key10" placeholder="请输入" clearable type="textarea" />
  160. </el-form-item>
  161. </el-form>
  162. </hc-card-item>
  163. <template #action>
  164. <el-button v-if="formInfo.id" type="info" @click="cancelClick">取消</el-button>
  165. <el-button v-if="!formInfo.id" color="#20C98B" type="primary" class="text-white" @click="createClick">创建</el-button>
  166. <el-button type="warning" @click="saveClick">保存</el-button>
  167. </template>
  168. </hc-card>
  169. </template>
  170. <script setup>
  171. import { computed, onMounted, ref, watch } from 'vue'
  172. import { isNullES } from 'js-fast-way'
  173. import { getDictionary } from '~api/dictbiz'
  174. import { arrToKey, formValidate, getArrValue, getObjValue, isArrItem } from 'js-fast-way'
  175. const props = defineProps({
  176. form: {
  177. type: Object,
  178. default: () => ({}),
  179. },
  180. })
  181. //事件
  182. const emit = defineEmits(['back'])
  183. //监听权限
  184. const formInfo = ref(props.form)
  185. watch(() => props.form, (data) => {
  186. formInfo.value = data
  187. })
  188. //渲染完成
  189. onMounted(() => {
  190. console.log(formInfo.value)
  191. getProStation()
  192. getProType()
  193. })
  194. const baseForm = ref({ key1:'', key2: '', key3:'', key4:'', key5:'', key6:'', key7:'', key8:'', key9:'' })
  195. const baseFormRules = {
  196. key1: {
  197. required: true,
  198. trigger: 'blur',
  199. message: '请输入项目名称',
  200. },
  201. key3: {
  202. required: true,
  203. trigger: 'blur',
  204. message: '请选择项目阶段',
  205. },
  206. key4: {
  207. required: true,
  208. trigger: 'blur',
  209. message: '请选择项目类型',
  210. },
  211. role: {
  212. required: true,
  213. trigger: 'blur',
  214. message: '请选择角色',
  215. },
  216. }
  217. const unitSelect = ref('')
  218. //项目阶段
  219. const stateOptions = ref([])
  220. const getProStation = async () => {
  221. const { error, code, data } = await getDictionary({ code:'projectStage' })
  222. if (!error && code === 200) {
  223. stateOptions.value = getArrValue(data)
  224. } else {
  225. stateOptions.value = []
  226. }
  227. }
  228. //项目类型
  229. const typeOptions = ref([])
  230. const getProType = async () => {
  231. const { error, code, data } = await getDictionary({ code:'projectType' })
  232. if (!error && code === 200) {
  233. typeOptions.value = getArrValue(data)
  234. } else {
  235. typeOptions.value = []
  236. }
  237. }
  238. const endYearRef = ref(null)
  239. const startYearRef = ref(null)
  240. //开始年
  241. const startYearChange = (val) => {
  242. baseForm.value.key5 = val
  243. endYearRef.value?.focus()
  244. endYearRef.value?.handleOpen()
  245. startYearRef.value?.handleClose()
  246. }
  247. //结束年
  248. const endYearChange = (val) => {
  249. if (isNullES(val)) {
  250. baseForm.value.key5 = ''
  251. }
  252. baseForm.value.key6 = val
  253. }
  254. //失去焦点
  255. const endYearBlur = () => {
  256. if (isNullES(baseForm.value.key5) || isNullES(baseForm.value.key6)) {
  257. baseForm.value.key5 = ''
  258. baseForm.value.key6 = ''
  259. window.$message.warning('请重新选择完整的范围年份')
  260. }
  261. let years = []
  262. let startYear = baseForm.value.key5
  263. let endYear = baseForm.value.key6
  264. for (let year = startYear; year <= endYear; year++) {
  265. years.push(
  266. {
  267. value:year,
  268. label:year,
  269. },
  270. )
  271. }
  272. yearOptions.value = years
  273. }
  274. //选择年份
  275. const yearOptions = ref([])
  276. const selectYear = ref('')
  277. const yearForm = ref({ key1:'', key2: '', key3:'', key4:'', key5:'', key6:'', key7:'', key8:'', key9:'', key10:'' })
  278. const yearFormRules = {}
  279. const formatInput = (value)=>{
  280. // 如果输入为空,则直接返回空字符串
  281. if (!value) {
  282. return ''
  283. }
  284. // 使用正则表达式匹配输入是否合法
  285. const regExp = /^\d+(\.\d{0,2})?$/
  286. if (regExp.test(value)) {
  287. return value // 如果输入合法,则返回原始值
  288. } else {
  289. // 如果输入不合法,则移除非法字符,并返回处理后的值
  290. return value.slice(0, -1)
  291. }
  292. }
  293. //监听
  294. watch(() => [
  295. yearForm.value.key2,
  296. yearForm.value.key3,
  297. yearForm.value.key4,
  298. yearForm.value.key5,
  299. ], ([key2, key3, key4, key5]) => {
  300. yearForm.value.key1 = Number(key2) + Number(key3) + Number(key4) + Number(key5)
  301. },
  302. )
  303. //取消
  304. const cancelClick = () => {
  305. emit('back')
  306. }
  307. //创建
  308. const createClick = () => {
  309. const form = formInfo.value
  310. if (isNullES(form.id)) cancelClick()
  311. console.log('创建')
  312. }
  313. //保存
  314. const saveClick = () => {
  315. const form = formInfo.value
  316. if (isNullES(form.id)) cancelClick()
  317. console.log('保存')
  318. }
  319. </script>
  320. <style lang="scss">
  321. .create-project .el-card .el-card__body .hc-card-main-body {
  322. padding: 14px;
  323. .el-scrollbar__bar.is-vertical {
  324. right: -16px;
  325. }
  326. }
  327. .hc-card-item-box.year-detail {
  328. padding: 20px;
  329. background: #f7f7f7;
  330. border-radius: 5px;
  331. .hc-card-item-header {
  332. border-bottom: 1px solid #ecebeb;
  333. padding-bottom: 16px;
  334. .item-header {
  335. justify-content: center;
  336. }
  337. }
  338. .hc-form-item-title {
  339. position: relative;
  340. padding: 10px 0;
  341. margin-bottom: 14px;
  342. }
  343. }
  344. .quarter-box {
  345. position: relative;
  346. justify-content: space-around;
  347. }
  348. .form-text {
  349. white-space: nowrap;
  350. color:var(--el-text-color-regular) ;
  351. font-size: var(--el-form-label-font-size);
  352. }
  353. </style>