addModal.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <hc-new-dialog widths="30rem" :show="isShow" title="新增中期支付证书" is-footer-center @close="addModalClose">
  3. <el-form ref="formRef" class="p-2" label-position="top" :model="formModel" :rules="formRules" size="large">
  4. <el-form-item label="计量期:" prop="contractPeriodId">
  5. <el-select v-model="formModel.contractPeriodId" block @change="changePeriod">
  6. <el-option v-for="item in allPeriodData" :key="item.id" :label="item.periodNumber" :value="item.id" />
  7. </el-select>
  8. </el-form-item>
  9. <el-form-item label="证书编号:" prop="certificateNumber">
  10. <el-input v-model="formModel.certificateNumber" />
  11. </el-form-item>
  12. <el-form-item label="材料计量期:" prop="materialPeriodIds">
  13. <div v-if="meterPeriodData.length > 0" class="form-item-div">
  14. <el-checkbox-group v-model="materialPeriodIds">
  15. <template v-for="item in meterPeriodData" :key="item.id">
  16. <el-checkbox v-if="item.periodNumber" :value="item.periodNumber">{{ item.periodName }}</el-checkbox>
  17. </template>
  18. </el-checkbox-group>
  19. </div>
  20. <div v-else class="form-item-div text-orange">无材料计量期可进行关联</div>
  21. </el-form-item>
  22. <el-form-item label="开工预付计量期:" prop="startPeriodIds">
  23. <div v-if="startPeriodData.length > 0" class="form-item-div">
  24. <el-checkbox-group v-model="startPeriodIds">
  25. <template v-for="item in startPeriodData" :key="item.id">
  26. <el-checkbox v-if="item.periodNumber" :value="item.periodNumber">{{ item.periodName }}</el-checkbox>
  27. </template>
  28. </el-checkbox-group>
  29. </div>
  30. <div v-else class="form-item-div text-orange">无开工计量期可进行关联</div>
  31. </el-form-item>
  32. <el-form-item label="打印日期:">
  33. <el-date-picker v-model="formModel.printDate" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" disabled />
  34. </el-form-item>
  35. </el-form>
  36. <template #footer>
  37. <el-button hc-btn @click="addModalClose">取消</el-button>
  38. <el-button hc-btn type="primary" :loading="submitLoading" @click="addModalSave">提交</el-button>
  39. <el-button hc-btn type="primary" :loading="submitLoading" @click="submitClose">提交并关闭</el-button>
  40. </template>
  41. </hc-new-dialog>
  42. </template>
  43. <script setup>
  44. import { ref, watch } from 'vue'
  45. import { useAppStore } from '~src/store'
  46. import { formValidate, getArrValue, getObjValue } from 'js-fast-way'
  47. import mainApi from '~api/debit-pay/admin/certificate'
  48. //事件
  49. const emit = defineEmits(['finish', 'close'])
  50. //变量
  51. const useAppState = useAppStore()
  52. const projectId = ref(useAppState.getProjectId || '')
  53. const contractId = ref(useAppState.getContractId || '')
  54. //双向绑定
  55. // eslint-disable-next-line no-undef
  56. const isShow = defineModel('modelValue', {
  57. default: false,
  58. })
  59. //获取合同计量期
  60. const allPeriodData = ref([])
  61. const getAllPeriod = async () => {
  62. const { data } = await mainApi.getConditionPeriod({
  63. projectId: projectId.value,
  64. contractId: contractId.value,
  65. })
  66. const res = getArrValue(data)
  67. allPeriodData.value = res
  68. if (res.length > 0) {
  69. const info = getObjValue(res[ res.length - 1])
  70. formModel.value.contractPeriodId = info.id
  71. formModel.value.printDate = info.formPrintDate
  72. }
  73. }
  74. //获取材料计量期
  75. const meterPeriodData = ref([])
  76. const materialPeriodIds = ref([])
  77. const getMeterPeriod = async () => {
  78. const { data } = await mainApi.getMeterPeriod({
  79. projectId: projectId.value,
  80. contractId: contractId.value,
  81. type: 1,
  82. })
  83. meterPeriodData.value = getArrValue(data)
  84. }
  85. const changePeriod = (val)=>{
  86. allPeriodData.value.forEach((ele)=>{
  87. if (ele.id === val) {
  88. formModel.value.printDate = ele.formPrintDate
  89. }
  90. })
  91. }
  92. //获取开工计量期
  93. const startPeriodData = ref([])
  94. const startPeriodIds = ref([])
  95. const getStartPeriod = async () => {
  96. const { data } = await mainApi.getMeterPeriod({
  97. projectId: projectId.value,
  98. contractId: contractId.value,
  99. type: 2,
  100. })
  101. startPeriodData.value = getArrValue(data)
  102. }
  103. //监听
  104. watch(isShow, (val) => {
  105. if (val) {
  106. formModel.value = {}
  107. getAllPeriod()
  108. getMeterPeriod()
  109. getStartPeriod()
  110. }
  111. })
  112. //表单数据
  113. const formRef = ref(null)
  114. const formModel = ref({})
  115. const formRules = {
  116. contractPeriodId: {
  117. required: true,
  118. trigger: 'blur',
  119. message: '请选择计量期',
  120. },
  121. }
  122. //提交保存
  123. const submitLoading = ref(false)
  124. const submitData = async () => {
  125. submitLoading.value = true
  126. const isValidate = await formValidate(formRef.value)
  127. if (!isValidate) return false
  128. const form = formModel.value
  129. form.projectId = projectId.value
  130. form.contractId = contractId.value
  131. form.materialPeriodIds = materialPeriodIds.value.join(',')
  132. form.startPeriodIds = startPeriodIds.value.join(',')
  133. const { error, code, msg } = await mainApi.add(form)
  134. if (!error && code === 200) {
  135. window.$message.success('保存成功')
  136. return true
  137. } else {
  138. submitLoading.value = false
  139. window.$message.error(msg ?? '保存失败')
  140. return false
  141. }
  142. }
  143. //保存
  144. const addModalSave = async () => {
  145. const isValidate = await submitData()
  146. if (isValidate) {
  147. formModel.value = {}
  148. formModel.value = {}
  149. await getAllPeriod()
  150. await getMeterPeriod()
  151. await getStartPeriod()
  152. submitLoading.value = false
  153. }
  154. }
  155. //提交并关闭
  156. const submitClose = async () => {
  157. const isValidate = await submitData()
  158. if (isValidate) {
  159. submitLoading.value = false
  160. addModalClose()
  161. emit('finish')
  162. }
  163. }
  164. //关闭弹窗
  165. const addModalClose = () => {
  166. isShow.value = false
  167. emit('close')
  168. }
  169. </script>