dataModal.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <hc-new-dialog
  3. widths="500px" :show="isShow" :title="modalTitle" :loading="modalSaving" @save="modalSave"
  4. @close="modalClose"
  5. >
  6. <el-scrollbar>
  7. <hc-card-item>
  8. <el-form
  9. ref="baseFormRef" :model="baseForm" :rules="baseFormRules" label-position="top"
  10. label-width="auto"
  11. >
  12. <el-form-item label="计量期:" prop="meterPeriodId">
  13. <el-select v-model="baseForm.meterPeriodId" placeholder="选择计量期" disabled filterable clearable block>
  14. <el-option v-for="item in key1Data" :key="item.id" :label="item.periodName" :value="item.id" />
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item label="业务日期:">
  18. <el-date-picker v-model="baseForm.businessDate" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" />
  19. </el-form-item>
  20. <el-form-item label="计量金额:">
  21. <el-input v-model="baseForm.meterMoney" @change="changeMoney" />
  22. </el-form-item>
  23. <el-form-item label="开工预付款总额:">
  24. <el-input v-model="baseForm.startPayAmount" disabled />
  25. </el-form-item>
  26. <el-form-item label="申请依据:">
  27. <el-input v-model="baseForm.applyCause" :autosize="{ minRows: 2, maxRows: 6 }" type="textarea" />
  28. </el-form-item>
  29. <el-form-item v-if="Number(contractType) === 2" label="支付期限:">
  30. <div class="w-full">
  31. <hc-date-picker :dates="betweenTime1" format="YYYY年MM月DD日" clearable @change="betweenTimeUpdate1" />
  32. </div>
  33. <div class="mt-2 w-full">
  34. <hc-date-picker :dates="betweenTime2" format="YYYY年MM月DD日" clearable @change="betweenTimeUpdate2" />
  35. </div>
  36. </el-form-item>
  37. <el-form-item label="预付款计算式:">
  38. <el-input v-model="baseForm.calculateFormula" :autosize="{ minRows: 2, maxRows: 6 }" type="textarea" />
  39. </el-form-item>
  40. </el-form>
  41. </hc-card-item>
  42. <!-- 附件列表 -->
  43. <hc-card-item class="mt-3">
  44. <el-form :model="baseForm" label-position="top">
  45. <el-form-item label="附件名称:">
  46. <el-input v-model="baseForm.fileNames" type="textarea" />
  47. </el-form-item>
  48. <div class="hc-flex mb-10px" style="color: #1d4590;">
  49. <div class="flex-1">附件列表</div>
  50. <div>可上传:图片、Excel、PDF、Word文件</div>
  51. </div>
  52. <el-form-item label="">
  53. <hc-form-upload
  54. v-model="baseForm.fileList" is-res
  55. :options="{ type: 'list', props: hProps, isArr: true, num: 0 }"
  56. @success="uploadFileSuccess"
  57. @change="formItemChange"
  58. @item="uploadFileItem"
  59. />
  60. </el-form-item>
  61. </el-form>
  62. </hc-card-item>
  63. </el-scrollbar>
  64. </hc-new-dialog>
  65. </template>
  66. <script setup>
  67. import { ref, watch } from 'vue'
  68. import { useAppStore } from '~src/store'
  69. import { formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
  70. import periodApi from '~api/debit-pay/material/periods.js'
  71. import orderApi from '~api/debit-pay/start-work/order.js'
  72. import { toPdfPage } from '~uti/btn-auth'
  73. import { isNumberReg } from '~uti/tools'
  74. const props = defineProps({
  75. ids: {
  76. type: [String, Number],
  77. default: '',
  78. },
  79. periodId: {
  80. type: [String, Number],
  81. default: '',
  82. },
  83. infoData: {
  84. type: Object,
  85. default: () => ({}),
  86. },
  87. })
  88. //事件
  89. const emit = defineEmits(['finish', 'close'])
  90. const useAppState = useAppStore()
  91. const contractId = ref(useAppState.getContractId)
  92. const projectId = ref(useAppState.getProjectId)
  93. const infoData = ref(props.infoData)
  94. const ids = ref(props.ids)
  95. const fileName = ref([])
  96. const hProps = ref({
  97. url: 'filePdfUrl',
  98. name: 'fileName',
  99. })
  100. //监听
  101. const contractType = ref('')
  102. const contractInfo = ref(useAppState.getContractInfo)
  103. watch(() => useAppState.getContractInfo, (info) => {
  104. contractInfo.value = info
  105. contractType.value = info?.contractType
  106. }, { immediate: true, deep: true })
  107. const baseForm = ref({})
  108. const modalTitle = ref('开工预付款计量单新增')
  109. //获取开工预付款总额
  110. const getStartAmountData = async () => {
  111. const { error, code, data } = await orderApi.getStartAmount({
  112. contractId: contractId.value,
  113. })
  114. if (!error && code === 200) {
  115. if (modalTitle.value === '开工预付款计量单新增') {
  116. baseForm.value.startPayAmount = Number(data)
  117. }
  118. } else {
  119. baseForm.value.startPayAmount = 0
  120. }
  121. }
  122. //监听
  123. watch(() => [props.ids, props.infoData], ([Id, info]) => {
  124. ids.value = Id
  125. infoData.value = info
  126. if (!isNullES(Id)) {
  127. baseForm.value = info
  128. fileName.value = info?.fileList
  129. modalTitle.value = '开工预付款计量单修改'
  130. } else {
  131. baseForm.value = { fileList: [] }
  132. fileName.value = []
  133. modalTitle.value = '开工预付款计量单新增'
  134. }
  135. }, { immediate: true, deep: true })
  136. //双向绑定
  137. // eslint-disable-next-line no-undef
  138. const isShow = defineModel('modelValue', {
  139. default: false,
  140. })
  141. //监听
  142. watch(() => props.periodId, (pid) => {
  143. baseForm.value.meterPeriodId = pid
  144. }, { immediate: true, deep: true })
  145. //监听
  146. watch(isShow, (val) => {
  147. if (val) {
  148. setDataApi()
  149. }
  150. })
  151. const setDataApi = () => {
  152. getKey1Data()
  153. getStartAmountData()
  154. contractType.value = contractInfo.value?.contractType
  155. baseForm.value.meterPeriodId = props.periodId
  156. const { payDate } = baseForm.value
  157. if (isNullES(payDate)) return
  158. const dates = payDate.split(' \n ')
  159. if (dates.length >= 2) {
  160. payDate1.value = dates[0]
  161. payDate2.value = dates[1]
  162. } else {
  163. payDate1.value = dates[0]
  164. }
  165. if (!isNullES(payDate1.value)) {
  166. betweenTime1.value = payDate1.value.split(' 至 ')
  167. }
  168. if (!isNullES(payDate2.value)) {
  169. betweenTime2.value = payDate2.value.split(' 至 ')
  170. }
  171. }
  172. //计量期
  173. const key1Data = ref([])
  174. const getKey1Data = async () => {
  175. const { data } = await periodApi.allPeriod({
  176. contractId: contractId.value,
  177. type: 2,
  178. })
  179. key1Data.value = getArrValue(data)
  180. }
  181. //基础表单
  182. const baseFormRef = ref(null)
  183. // const baseForm = ref({})
  184. const baseFormRules = {
  185. meterPeriodId: {
  186. required: true,
  187. trigger: 'blur',
  188. message: '请选择材料计量期',
  189. },
  190. }
  191. //日期范围选择
  192. const payDate1 = ref('')
  193. const betweenTime1 = ref(null)
  194. const betweenTimeUpdate1 = ({ val, arr }) => {
  195. betweenTime1.value = arr
  196. if (arr.length > 0) {
  197. payDate1.value = `${val['start']} 至 ${val['end']}`
  198. } else {
  199. payDate1.value = null
  200. }
  201. }
  202. //日期范围选择
  203. const payDate2 = ref('')
  204. const betweenTime2 = ref(null)
  205. const betweenTimeUpdate2 = ({ val, arr }) => {
  206. betweenTime2.value = arr
  207. if (arr.length > 0) {
  208. payDate2.value = `${val['start']} 至 ${val['end']}`
  209. } else {
  210. payDate2.value = null
  211. }
  212. }
  213. const modalSaving = ref(false)
  214. const modalSave = async () => {
  215. const res = await formValidate(baseFormRef.value)
  216. if (!res) {
  217. return false
  218. }
  219. modalSaving.value = true
  220. const form = baseForm.value
  221. if (!isNullES(payDate1.value) && !isNullES(payDate2.value)) {
  222. form.payDate = payDate1.value + ' \n ' + payDate2.value
  223. } else if (!isNullES(payDate1.value) && isNullES(payDate2.value)) {
  224. form.payDate = payDate1.value
  225. } else if (isNullES(payDate1.value) && !isNullES(payDate2.value)) {
  226. form.payDate = payDate2.value
  227. } else {
  228. form.payDate = ''
  229. }
  230. key1Data.value.forEach((ele) => {
  231. if (ele.id === form.meterPeriodId) {
  232. baseForm.value.periodName = ele.periodName
  233. baseForm.value.periodNumber = ele.periodNumber
  234. }
  235. })
  236. if (ids.value.length < 1) {
  237. const { error, code, msg } = await orderApi.add({
  238. ...form,
  239. contractId: contractId.value,
  240. projectId: projectId.value,
  241. })
  242. //判断状态
  243. modalSaving.value = false
  244. if (!error && code === 200) {
  245. window?.$message?.success(msg)
  246. modalClose()
  247. emit('finish')
  248. } else {
  249. window.$message.error(msg ?? '操作失败')
  250. }
  251. } else if (ids.value.length > 0) {
  252. const { error, code, msg } = await orderApi.update({
  253. ...form,
  254. contractId: contractId.value,
  255. projectId: projectId.value,
  256. })
  257. //判断状态
  258. modalSaving.value = false
  259. if (!error && code === 200) {
  260. window?.$message?.success(msg)
  261. modalClose()
  262. emit('finish')
  263. } else {
  264. window.$message.error(msg ?? '操作失败')
  265. }
  266. }
  267. }
  268. const modalClose = () => {
  269. isShow.value = false
  270. payDate1.value = ''
  271. payDate2.value = ''
  272. betweenTime1.value = null
  273. betweenTime2.value = null
  274. emit('close')
  275. }
  276. //改变计量金额
  277. const changeMoney = (val) => {
  278. //如果为空
  279. let momey = val
  280. const isMeter = isNumberReg(momey)
  281. if (isNullES(momey) || !isMeter) {
  282. momey = 0
  283. baseForm.value.meterMoney = momey
  284. }
  285. }
  286. // 文件上传成功的回调
  287. const uploadFileSuccess = ({ res }, resolve) => {
  288. const { link, pdfUrl, originalName } = getObjValue(res.data)
  289. if (isNullES(pdfUrl)) {
  290. window.$message.warning('该文件不能生成pdf,请更换文件上传')
  291. resolve()
  292. } else {
  293. resolve({
  294. fileName: originalName ?? '',
  295. filePdfUrl: pdfUrl ?? '',
  296. fileUrl: link ?? '',
  297. })
  298. }
  299. }
  300. //文件被点击
  301. const uploadFileItem = ({ file }) => {
  302. const { url } = getObjValue(file)
  303. if (isNullES(url)) return
  304. toPdfPage(url)
  305. }
  306. const formItemChange = (data) => {
  307. fileName.value = data
  308. }
  309. </script>
  310. <style scoped lang="scss">
  311. </style>