periods.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <hc-new-card title="合同计量期">
  3. <template #extra>
  4. <el-button hc-btn type="primary" @click="editModalClick">
  5. <HcIcon name="add" />
  6. <span>编辑</span>
  7. </el-button>
  8. </template>
  9. <hc-table is-new :index-style="{ width: 60 }" :column="tableColumn" :datas="tableData" :loading="tableLoading" />
  10. <template #action>
  11. <hc-pages :pages="searchForm" @change="pageChange" />
  12. </template>
  13. <!-- 计量期编辑 -->
  14. <hc-new-dialog
  15. is-table widths="1200px" :show="editModalShow" title="计量期编辑" :loading="saveLoading"
  16. @save="editModalSave" @close="editModalClose"
  17. >
  18. <hc-card-item>
  19. <template #header>
  20. <el-tooltip :visible="editVisible" effect="light" placement="bottom-start">
  21. <template #content>
  22. <div class="text-sm text-red">
  23. 1.日期不能为空<br>
  24. 2.同一期的结束日期不能小于开始日期<br>
  25. 3.连续的两期,上一期结束日期和下一期的开始日期必须连续<br>
  26. 如:期号1的结束日期为2018-1-25,则期号2的开始日期必须是2018-1-26 !<br>
  27. 4.已经存在数据的计量周期不能进行删除!<br>
  28. 5.已经存在上报数据的计量周期不能进行数据修改
  29. </div>
  30. </template>
  31. <el-button type="danger" @mouseenter="editVisible = true" @mouseleave="editVisible = false">
  32. <HcIcon name="question" />
  33. <span>编辑说明</span>
  34. </el-button>
  35. </el-tooltip>
  36. </template>
  37. <template #extra>
  38. <el-button type="primary" @click="addPreRow">
  39. <HcIcon name="page-separator" :line="false" />
  40. <span>插入上一行</span>
  41. </el-button>
  42. <el-button type="primary" @click="addNextRow">
  43. <HcIcon name="page-separator" :line="false" />
  44. <span>插入下一行</span>
  45. </el-button>
  46. </template>
  47. <hc-table
  48. is-new :index-style="{ width: 60 }" :column="tableEditColumn" :datas="tableEditData"
  49. :loading="tableEditLoading" is-current-row @row-click="hangeRow"
  50. >
  51. <template #periodNumber="{ row }">
  52. <hc-table-input v-model="row.periodNumber" :disabled="getRowStatus1(row)" />
  53. </template>
  54. <template #payNumber="{ row }">
  55. <hc-table-input v-model="row.payNumber" disabled />
  56. </template>
  57. <template #periodYear="{ row }">
  58. <el-select v-model="row.periodYear" placeholder="选择年份" filterable block :disabled="getRowStatus1(row)">
  59. <el-option v-for="item in yearData" :key="item" :label="item" :value="item" />
  60. </el-select>
  61. </template>
  62. <template #periodMonth="{ row }">
  63. <el-select v-model="row.periodMonth" placeholder="选择月份" filterable block :disabled="getRowStatus1(row)">
  64. <el-option v-for="item in monthData" :key="item" :label="item" :value="item" />
  65. </el-select>
  66. </template>
  67. <template #startDate="{ row }">
  68. <el-date-picker
  69. v-model="row.startDate" class="block" format="YYYY-MM-DD" type="date"
  70. value-format="YYYY-MM-DD"
  71. :disabled="getRowStatus1(row)"
  72. @change="changeStart($event, row)"
  73. />
  74. </template>
  75. <template #endDate="{ row }">
  76. <el-date-picker
  77. v-model="row.endDate" class="block" format="YYYY-MM-DD" type="date"
  78. value-format="YYYY-MM-DD"
  79. :disabled="getRowStatus1(row)"
  80. @change="changeEnd($event, row)"
  81. />
  82. </template>
  83. <template #formPrintDate="{ row }">
  84. <el-date-picker v-model="row.formPrintDate" class="block" format="YYYY-MM-DD" type="date" value-format="YYYY-MM-DD" :disabled="getRowStatus1(row)" />
  85. </template>
  86. <template #action="{ row, index }">
  87. <el-link type="danger" :disabled="getRowStatus2(row)" @click="delRow(row, index)">删除</el-link>
  88. </template>
  89. </hc-table>
  90. </hc-card-item>
  91. </hc-new-dialog>
  92. </hc-new-card>
  93. </template>
  94. <script setup>
  95. import { onActivated, ref } from 'vue'
  96. import dayjs from 'dayjs'
  97. import { getArrValue, getMonthList, getYearList, isNullES } from 'js-fast-way'
  98. import mainApi from '~api/debit-pay/admin/periods.js'
  99. import { useAppStore } from '~src/store'
  100. const useAppState = useAppStore()
  101. const contractId = ref(useAppState.getContractId)
  102. const projectId = ref(useAppState.getProjectId)
  103. defineOptions({
  104. name: 'DebitPayAdminPeriods',
  105. })
  106. //获取年月等相关日期数据
  107. const year = Number(dayjs().format('YYYY')) + 8
  108. const yearData = getYearList(year, 2010)
  109. const monthData = getMonthList()
  110. //渲染完成
  111. onActivated(() => {
  112. getTableData()
  113. })
  114. //搜索表单
  115. const searchForm = ref({ current: 1, size: 20, total: 0 })
  116. //分页
  117. const pageChange = ({ current, size }) => {
  118. searchForm.value.current = current
  119. searchForm.value.size = size
  120. getTableData()
  121. }
  122. //表格数据
  123. const tableLoading = ref(false)
  124. const tableColumn = ref([
  125. { key: 'periodNumber', name: '期号' },
  126. { key: 'payNumber', name: '支付期编号' },
  127. { key: 'periodYear', name: '年份' },
  128. { key: 'periodMonth', name: '月份' },
  129. { key: 'startDate', name: '开始日期' },
  130. { key: 'endDate', name: '结束日期' },
  131. { key: 'formPrintDate', name: '报表打印日期' },
  132. ])
  133. const tableData = ref([])
  134. const getTableData = async () => {
  135. tableLoading.value = true
  136. const { error, code, data } = await mainApi.getPage({
  137. ...searchForm.value,
  138. contractId: contractId.value,
  139. type: 1,
  140. })
  141. tableLoading.value = false
  142. if (!error && code === 200) {
  143. tableData.value = getArrValue(data['records'])
  144. searchForm.value.total = data['total']
  145. } else {
  146. tableData.value = []
  147. }
  148. }
  149. //计量期编辑
  150. const editVisible = ref(false)
  151. const editModalShow = ref(false)
  152. const editModalClick = () => {
  153. editModalShow.value = true
  154. getContractNumber()
  155. getTableEditData()
  156. }
  157. //判断修改状态
  158. const getRowStatus1 = ({ approveStatus, isNew }) => {
  159. if (isNew) return false
  160. return approveStatus !== 0
  161. }
  162. //判断删除状态
  163. const getRowStatus2 = ({ approveStatus, dataStatus, citeStatus, isNew }) => {
  164. if (isNew) return false
  165. if (approveStatus !== 0) {
  166. return true
  167. } else {
  168. return dataStatus === 1 || citeStatus === 1
  169. }
  170. }
  171. //获取合同编号
  172. const contractNumber = ref('')
  173. const getContractNumber = async () => {
  174. const { data } = await mainApi.getContractNumber({
  175. contractId: contractId.value,
  176. })
  177. contractNumber.value = isNullES(data) ? '' : data
  178. }
  179. const curIndex = ref(0)
  180. const curRow = ref({})
  181. const hangeRow = ({ row }) => {
  182. tableEditData.value.forEach((ele, index) => {
  183. if (row.id === ele.id) {
  184. curIndex.value = index
  185. curRow.value = ele
  186. }
  187. })
  188. }
  189. const addPreRow = () => {
  190. tableEditData.value.splice(curIndex.value, 0, { isNew: true })
  191. }
  192. const addNextRow = () => {
  193. if (!curRow.value?.endDate) {
  194. curRow.value.endDate = tableEditData.value[tableEditData.value.length - 1].endDate
  195. }
  196. const netxtDay = getNextDate(curRow.value?.endDate)
  197. tableEditData.value.splice(curIndex.value + 1, 0, { isNew: true, startDate: netxtDay })
  198. }
  199. //获取连续的时间
  200. const getNextDate = (data) => {
  201. let dateString = data
  202. // 将日期字符串转换为 Date 对象
  203. let dateObject = new Date(dateString)
  204. // 将日期加一天
  205. dateObject.setDate(dateObject.getDate() + 1)
  206. // 获取新日期的年、月、日
  207. let year = dateObject.getFullYear()
  208. let month = dateObject.getMonth() + 1 // 注意:月份从0开始,所以要加1
  209. let day = dateObject.getDate()
  210. // 将年、月、日格式化为字符串
  211. let newDateString = `${year}-${month < 10 ? '0' + month : month}-${day < 10 ? '0' + day : day}`
  212. // 输出结果
  213. console.log(newDateString)
  214. return newDateString
  215. }
  216. const delRow = (row, index) => {
  217. console.log(index, 'index')
  218. tableEditData.value.splice(index, 1)
  219. // if ( tableEditData.value.length === 0) {
  220. // tableEditData.value.push({})
  221. // }
  222. }
  223. //编辑的表格
  224. const tableEditColumn = [
  225. { key: 'periodNumber', name: '期号' },
  226. { key: 'payNumber', name: '支付期编号' },
  227. { key: 'periodYear', name: '年份' },
  228. { key: 'periodMonth', name: '月份' },
  229. { key: 'startDate', name: '开始日期' },
  230. { key: 'endDate', name: '结束日期' },
  231. { key: 'formPrintDate', name: '报表打印日期' },
  232. { key: 'action', name: '操作', width: 80, align: 'center' },
  233. ]
  234. const tableEditData = ref([])
  235. const tableEditLoading = ref(false)
  236. const getTableEditData = async () => {
  237. tableEditLoading.value = true
  238. const { error, code, data } = await mainApi.allPeriod({
  239. ...searchForm.value,
  240. contractId: contractId.value,
  241. type: 1,
  242. })
  243. tableEditLoading.value = false
  244. if (!error && code === 200) {
  245. tableEditData.value = getArrValue(data)
  246. curIndex.value = tableEditData.value.length
  247. if (tableEditData.value.length === 0) {
  248. tableEditData.value.push({ isNew: true })
  249. }
  250. } else {
  251. tableEditData.value = []
  252. }
  253. }
  254. const saveLoading = ref(false)
  255. const editModalSave = async () => {
  256. saveLoading.value = true
  257. tableEditData.value.forEach(ele => {
  258. ele.contractId = contractId.value
  259. ele.projectId = projectId.value
  260. })
  261. const { error, code, msg } = await mainApi.edit({
  262. list: tableEditData.value,
  263. contractId: contractId.value,
  264. projectId: projectId.value,
  265. type: 1,
  266. })
  267. //判断状态
  268. saveLoading.value = false
  269. if (!error && code === 200) {
  270. window?.$message?.success(msg)
  271. getTableData()
  272. editModalClose()
  273. } else {
  274. window.$message.error(msg)
  275. }
  276. }
  277. const editModalClose = () => {
  278. editModalShow.value = false
  279. }
  280. const changeStart = (val, row) => {
  281. if (val > row.endDate) {
  282. window.$message.warning('开始时间不能晚于结束时间')
  283. row.startDate = ''
  284. }
  285. }
  286. const changeEnd = (val, row) => {
  287. if (val < row.startDate) {
  288. window.$message.warning('结束时间不能早于开始时间')
  289. row.endDate = ''
  290. if (val) {
  291. row.formPrintDate = row.endDate
  292. }
  293. }
  294. if (val) {
  295. row.formPrintDate = row.endDate
  296. }
  297. }
  298. </script>
  299. <style scoped lang="scss">
  300. </style>