contract.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <template>
  2. <hc-new-card title="合同材料">
  3. <template #extra>
  4. <el-button hc-btn type="primary" @click="rowAddClick">
  5. <HcIcon name="add" />
  6. <span>新增</span>
  7. </el-button>
  8. </template>
  9. <div class="relative h-full flex">
  10. <div class="flex-1">
  11. <hc-card-item>
  12. <hc-table :column="tableColumn" :datas="tableData" :loading="tableLoading" is-new :index-style="{ width: 60 }" is-current-row @row-click="viewRow">
  13. <template #action="{ row }">
  14. <el-link type="success" @click="rowEditClick(row)">修改</el-link>
  15. <el-link type="danger" @click="delRowClick(row)">删除</el-link>
  16. </template>
  17. </hc-table>
  18. <template #action>
  19. <hc-pages :pages="searchForm" @change="pageChange" />
  20. </template>
  21. </hc-card-item>
  22. </div>
  23. <div class="ml-3 w-[400px]">
  24. <hc-card-item title="详情信息" scrollbar>
  25. <el-form label-position="left" :model="infoData" label-width="auto" size="large" disabled>
  26. <el-form-item label="材料编号:">
  27. <el-input v-model="infoData.materialNumber" />
  28. </el-form-item>
  29. <el-form-item label="材料名称:">
  30. <el-input v-model="infoData.materialName" />
  31. </el-form-item>
  32. <el-form-item label="规格型号:">
  33. <el-input v-model="infoData.specification" />
  34. </el-form-item>
  35. <el-form-item label="单位:">
  36. <el-input v-model="infoData.unit" />
  37. </el-form-item>
  38. <el-form-item label="单价:">
  39. <el-input v-model="infoData.price" />
  40. </el-form-item>
  41. <el-form-item label="数量:">
  42. <el-input v-model="infoData.amount" />
  43. </el-form-item>
  44. </el-form>
  45. </hc-card-item>
  46. </div>
  47. </div>
  48. <!-- 新增/修改 -->
  49. <hc-new-dialog widths="30rem" :show="isFormModal" :title="modalTitle" :loading="saveLoaing" @save="modalSave" @close="modalClose">
  50. <el-form ref="formRef" class="p-2" label-position="top" :model="formModel" :rules="formRules" size="large">
  51. <el-form-item label="材料编号:">
  52. <el-input v-model="formModel.materialNumber" />
  53. </el-form-item>
  54. <el-form-item label="材料名称:" prop="materialName">
  55. <el-input v-model="formModel.materialName" />
  56. </el-form-item>
  57. <el-form-item label="规格型号:">
  58. <el-input v-model="formModel.specification" />
  59. </el-form-item>
  60. <el-form-item label="单位:">
  61. <el-input v-model="formModel.unit " />
  62. </el-form-item>
  63. <el-form-item label="单价:">
  64. <el-input-number v-model="formModel.price" :controls="false" :min="0" class="w-100" />
  65. </el-form-item>
  66. <el-form-item label="数量:">
  67. <el-input-number v-model="formModel.amount" :controls="false" :min="0" class="w-100" />
  68. </el-form-item>
  69. </el-form>
  70. </hc-new-dialog>
  71. </hc-new-card>
  72. </template>
  73. <script setup>
  74. import { onActivated, onMounted, ref } from 'vue'
  75. import mainApi from '~api/debit-pay/material/contract.js'
  76. import { useAppStore } from '~src/store'
  77. import { deepClone, formValidate, getArrValue } from 'js-fast-way'
  78. import { delMessageV2 } from '~com/message/index.js'
  79. const useAppState = useAppStore()
  80. const projectId = ref(useAppState.getProjectId)
  81. const contractId = ref(useAppState.getContractId)
  82. defineOptions({
  83. name: 'DebitPayMaterialContract',
  84. })
  85. //渲染完成
  86. onActivated(() => {
  87. getTableData()
  88. })
  89. //搜索表单
  90. const searchForm = ref({
  91. current: 1, size: 10, total: 0,
  92. })
  93. //分页
  94. const pageChange = ({ current, size }) => {
  95. searchForm.value.current = current
  96. searchForm.value.size = size
  97. getTableData()
  98. }
  99. //表格数据
  100. const tableLoading = ref(false)
  101. const tableColumn = ref([
  102. { key: 'materialNumber', name: '材料编号' },
  103. { key: 'materialName', name: '材料名称' },
  104. { key: 'specification', name: '规格型号' },
  105. { key: 'unit', name: '单位' },
  106. { key: 'price', name: '单价' },
  107. { key: 'amount', name: '数量' },
  108. { key: 'action', name: '操作', width: 100 },
  109. ])
  110. const tableData = ref([])
  111. const infoData = ref({})
  112. const getTableData = async () => {
  113. tableLoading.value = true
  114. const { error, code, data } = await mainApi.getPage({
  115. ...searchForm.value,
  116. projectId:projectId.value,
  117. contractId:contractId.value,
  118. })
  119. tableLoading.value = false
  120. if (!error && code === 200) {
  121. tableData.value = getArrValue(data['records'])
  122. searchForm.value.total = data['total']
  123. if (tableData.value.length > 0) {
  124. infoData.value = tableData.value[0]
  125. // getDetail(tableData.value[0].id)
  126. }
  127. } else {
  128. tableData.value = []
  129. searchForm.value.total = 0
  130. }
  131. }
  132. const viewRow = ({ row })=>{
  133. infoData.value = row
  134. }
  135. const modalTitle = ref('')
  136. //新增
  137. const isFormModal = ref(false)
  138. const rowAddClick = () => {
  139. isFormModal.value = true
  140. formModel.value = {}
  141. modalTitle.value = '合同材料新增'
  142. }
  143. //表单数据
  144. const formRef = ref(null)
  145. const formModel = ref({})
  146. const formRules = {
  147. materialName: {
  148. required: true,
  149. trigger: 'blur',
  150. message: '请输入材料名称',
  151. },
  152. }
  153. //修改
  154. const rowEditClick = (row) => {
  155. modalTitle.value = '合同材料修改'
  156. isFormModal.value = true
  157. formModel.value = deepClone(row)
  158. }
  159. //保存
  160. const saveLoaing = ref(false)
  161. const modalSave = async () => {
  162. const res = await formValidate(formRef.value)
  163. if (res) {
  164. saveLoaing.value = true
  165. const { error, code, msg } = await mainApi.submit({
  166. ...formModel.value,
  167. projectId:projectId.value,
  168. contractId:contractId.value,
  169. })
  170. //判断状态
  171. saveLoaing.value = false
  172. if (!error && code === 200) {
  173. window?.$message?.success(msg)
  174. } else {
  175. window.$message.error(msg ?? '操作失败')
  176. }
  177. getTableData()
  178. modalClose()
  179. }
  180. }
  181. const delRowClick = async (row)=>{
  182. delMessageV2(async (action, instance, done) => {
  183. if (action === 'confirm') {
  184. instance.confirmButtonLoading = true
  185. removeCon(row.id)
  186. instance.confirmButtonLoading = false
  187. done()
  188. } else {
  189. done()
  190. }
  191. })
  192. }
  193. const removeCon = async (id) => {
  194. const { error, code, msg } = await mainApi.remove({
  195. ids: id,
  196. })
  197. if (!error && code === 200) {
  198. window?.$message?.success('删除成功')
  199. getTableData()
  200. formModel.value = {}
  201. } else {
  202. window.$message.error(msg ?? '操作失败')
  203. }
  204. }
  205. //关闭弹窗
  206. const modalClose = () => {
  207. isFormModal.value = false
  208. }
  209. </script>
  210. <style scoped lang="scss">
  211. </style>