purPaymentRequestForm.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <a-spin :spinning="loading">
  3. <JFormContainer :disabled="disabled">
  4. <template #detail>
  5. <a-form v-bind="formItemLayout" name="purPaymnetRequest" ref="formRef">
  6. <a-row>
  7. <a-col :span="12">
  8. <a-form-item label="申请单编号(bill code)" v-bind="validateInfos.billCode" id="purPaymnetRequest-billCode" name="billCode">
  9. <a-input v-model:value="formData.billCode" placeholder="自动生成" disabled></a-input>
  10. </a-form-item>
  11. </a-col>
  12. <a-col :span="12">
  13. <a-form-item label="申请日期(bill date)" v-bind="validateInfos.billDate" id="purPaymnetRequest-billDate" name="billDate">
  14. <a-date-picker placeholder="请选择发票日期(bill date)" v-model:value="formData.billDate" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
  15. </a-form-item>
  16. </a-col>
  17. <a-col :span="12">
  18. <a-form-item label="供应商(supplier)" v-bind="validateInfos.supplier" id="purPaymnetRequest-supplier" name="supplier">
  19. <ApiSelect
  20. :api="supplierOption"
  21. showSearch
  22. v-model:value="formData.supplier"
  23. :filterOption="false"
  24. resultField="records"
  25. labelField="name"
  26. valueField="id"
  27. :params='{pageSize:-1}'
  28. @change="changeSupplier"
  29. />
  30. </a-form-item>
  31. </a-col>
  32. <a-col :span="12">
  33. <a-form-item label="预计付款日期(expected payment date)" v-bind="validateInfos.expectedPaymentDate" id="purPaymnetRequest-expectedPaymentDate" name="expectedPaymentDate">
  34. <a-date-picker placeholder="请选择预计付款日期(expected payment date)" v-model:value="formData.expectedPaymentDate" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
  35. </a-form-item>
  36. </a-col>
  37. <a-col :span="12">
  38. <a-form-item label="收款人(payee)" v-bind="validateInfos.payee" id="purPaymnetRequest-payee" name="payee">
  39. <a-input v-model:value="formData.payee" placeholder="" AutoComplete="off"></a-input>
  40. </a-form-item>
  41. </a-col>
  42. <a-col :span="12">
  43. <a-form-item label="开户行(opening bank)" v-bind="validateInfos.openingBank" id="purPaymnetRequest-openingBank" name="openingBank">
  44. <a-input v-model:value="formData.openingBank" placeholder="请输入" allow-clear AutoComplete="off"></a-input>
  45. </a-form-item>
  46. </a-col>
  47. <a-col :span="12">
  48. <a-form-item label="银行账号(bank account)" v-bind="validateInfos.bankAccount" id="purPaymnetRequest-bankAccount" name="bankAccount">
  49. <a-input v-model:value="formData.bankAccount" placeholder="请输入" allow-clear AutoComplete="off"></a-input>
  50. </a-form-item>
  51. </a-col>
  52. <a-col :span="12">
  53. <a-form-item label="银行代码(swift code)" v-bind="validateInfos.swiftCode" id="purPaymnetRequest-swiftCode" name="swiftCode">
  54. <a-input v-model:value="formData.swiftCode" placeholder="请输入" allow-clear AutoComplete="off"></a-input>
  55. </a-form-item>
  56. </a-col>
  57. <a-col :span="12">
  58. <a-form-item label="币种(currency)" v-bind="validateInfos.currency" id="purPaymnetRequest-currency" name="currency">
  59. <JDictSelectTag v-model:value="formData.currency" placeholder="请选择" dictCode="currency" style="width: 100%;"/>
  60. </a-form-item>
  61. </a-col>
  62. <a-col :span="12">
  63. <a-form-item label="备注(notes)" v-bind="validateInfos.notes" id="purPaymnetRequest-notes" name="notes">
  64. <a-input v-model:value="formData.notes" placeholder="请输入备注(notes)" allow-clear AutoComplete="off"></a-input>
  65. </a-form-item>
  66. </a-col>
  67. <a-col :span="12">
  68. <a-form-item label="委托收款证明(entrusted certificate)" v-bind="validateInfos.collectionCertificate" name="collectionCertificate" >
  69. <JUpload v-model:value="formData.collectionCertificate"></JUpload>
  70. </a-form-item>
  71. </a-col>
  72. </a-row>
  73. </a-form>
  74. </template>
  75. </JFormContainer>
  76. <!-- 子表单区域 -->
  77. <a-tabs v-model:activeKey="activeKey" animated style=" padding: 24px;padding-top: 0px;">
  78. <a-tab-pane tab="采购付款申请 - 付款明细(payment details)" key="paymentDetails" :forceRender="true">
  79. <a-button type="primary" style="margin-right: 1%;margin-bottom: 1%;" @click="selectOrder"> 选择采购订单(select purchase order)</a-button>
  80. <j-vxe-table
  81. :keep-source="true"
  82. resizable
  83. ref="paymentDetailsTableRef"
  84. :loading="paymentDetailsTable.loading"
  85. :columns="paymentDetailsTable.columns"
  86. :dataSource="paymentDetailsTable.dataSource"
  87. :height="340"
  88. :disabled="disabled"
  89. :rowNumber="true"
  90. :rowSelection="true"
  91. asyncRemove
  92. @valueChange="changeValues"
  93. >
  94. <template #action="props">
  95. <a-popconfirm title="确定删除吗?" @confirm="handleDelete1(props)">
  96. <a>删除(delete)</a>
  97. </a-popconfirm>
  98. </template>
  99. <template #viewDetail="props">
  100. <a>查看(view)</a>
  101. </template>
  102. <template #invoice="props">
  103. <JUpload v-model:value="props.row.invoice"></JUpload>
  104. </template>
  105. </j-vxe-table>
  106. </a-tab-pane>
  107. </a-tabs>
  108. <SelectPurchaseOrderModal ref="SelectPurchaseOrderModalRef" @selectPurchaseOrder="addDetailList"></SelectPurchaseOrderModal>
  109. </a-spin>
  110. </template>
  111. <script lang="ts">
  112. import { defineComponent, ref, reactive, computed, toRaw, onMounted } from 'vue';
  113. import { defHttp } from '/@/utils/http/axios';
  114. import { useValidateAntFormAndTable } from '/@/hooks/system/useJvxeMethods';
  115. import { supplierOption,queryPaymentDetailListByMainId,queryDataById, saveOrUpdate } from '../purPaymentRequestForm.api';
  116. import { JVxeTable } from '/@/components/jeecg/JVxeTable';
  117. import { paymentDetailColumns} from '../purPaymentRequest.data';
  118. import SelectPurchaseOrderModal from '../../../publicComponents/SelectPurchaseOrderModal.vue';
  119. import JFormContainer from '/@/components/Form/src/container/JFormContainer.vue';
  120. import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
  121. import { ApiSelect } from '/@/components/Form';
  122. import { JDictSelectTag} from '/@/components/Form';
  123. import { Form,message } from 'ant-design-vue';
  124. import { useUserStore } from '/@/store/modules/user';
  125. import moment from 'moment';
  126. const userStore = useUserStore();
  127. const useForm = Form.useForm;
  128. export default defineComponent({
  129. name: "purPaymentRequestForm",
  130. components:{
  131. JVxeTable,
  132. JFormContainer,
  133. JUpload,
  134. JDictSelectTag,
  135. SelectPurchaseOrderModal,
  136. ApiSelect
  137. },
  138. props:{
  139. formDisabled:{
  140. type: Boolean,
  141. default: false
  142. },
  143. formData: { type: Object, default: ()=>{} },
  144. formBpm: { type: Boolean, default: true }
  145. },
  146. emits:['success'],
  147. setup(props, {emit}) {
  148. const loading = ref(false);
  149. const formRef = ref();
  150. const SelectPurchaseOrderModalRef = ref()
  151. const paymentDetailsTableRef = ref();
  152. const paymentDetailsTable = reactive<Record<string, any>>({
  153. loading: false,
  154. columns: paymentDetailColumns,
  155. dataSource: []
  156. });
  157. const activeKey = ref('paymentDetails');
  158. var notAllowEdit = ref(false);
  159. const formData = reactive<Record<string, any>>({
  160. id: '',
  161. status: undefined,
  162. delFlag: undefined,
  163. sourceCode:'',
  164. billDate: moment(new Date()).format('YYYY-MM-DD'),
  165. billCode: '',
  166. supplier: '',
  167. supplierName: '',
  168. expectedPaymentDate: '',
  169. payee: '',
  170. openingBank: '',
  171. bankAccount: '',
  172. swiftCode: '',
  173. currency: '',
  174. notes:'',
  175. collectionCertificate:''
  176. });
  177. //表单验证
  178. const validatorRules = reactive({
  179. });
  180. const {resetFields, validate, validateInfos} = useForm(formData, validatorRules, {immediate: false});
  181. const dbData = {};
  182. const formItemLayout = {
  183. labelCol: {xs: {span: 24}, sm: {span: 8}},
  184. wrapperCol: {xs: {span: 24}, sm: {span: 13}},
  185. labelCol1: {xs: {span: 24}, sm: {span: 8}},
  186. wrapperCol1: {xs: {span: 24}, sm: {span: 13}},
  187. };
  188. // 表单禁用
  189. const disabled = computed(()=>{
  190. if(props.formBpm === true){
  191. if(props.formData.disabled === false){
  192. return false;
  193. }else{
  194. return true;
  195. }
  196. }
  197. return props.formDisabled;
  198. });
  199. //新增方法
  200. function add() {
  201. resetFields();
  202. paymentDetailsTable.dataSource = [];
  203. activeKey.value = 'paymentDetails'
  204. notAllowEdit.value = false
  205. }
  206. //编辑方法
  207. async function edit(row) {
  208. //主表数据
  209. await queryMainData(row.id);
  210. const paymentDetailsDataList = await queryPaymentDetailListByMainId(row['id']);
  211. paymentDetailsTable.dataSource = [...paymentDetailsDataList];
  212. notAllowEdit.value=true
  213. }
  214. //获取主表
  215. async function queryMainData(id) {
  216. const row = await queryDataById(id);
  217. resetFields();
  218. const tmpData = {};
  219. Object.keys(formData).forEach((key) => {
  220. if(row.hasOwnProperty(key)){
  221. tmpData[key] = row[key]
  222. }
  223. })
  224. //赋值
  225. Object.assign(formData,tmpData);
  226. }
  227. const {getSubFormAndTableData, transformData} = useValidateAntFormAndTable(activeKey, {
  228. 'purPaymentRequestDetails': paymentDetailsTableRef,
  229. });
  230. //获取表单信息
  231. async function getFormData() {
  232. try {
  233. // 触发表单验证
  234. await validate();
  235. } catch ({ errorFields }) {
  236. if (errorFields) {
  237. const firstField = errorFields[0];
  238. if (firstField) {
  239. formRef.value.scrollToField(firstField.name, { behavior: 'smooth', block: 'center' });
  240. }
  241. }
  242. return Promise.reject(errorFields);
  243. }
  244. return transformData(toRaw(formData))
  245. }
  246. //保存
  247. async function submitForm() {
  248. const mainData = await getFormData();
  249. const subData = await getSubFormAndTableData();
  250. if(!subData.purPaymentRequestDetailsList||subData.purPaymentRequestDetailsList.lenght==0){
  251. message.warning('请添加付款明细')
  252. }else{
  253. const values = Object.assign({}, dbData, mainData, subData);
  254. console.log('表单提交数据', values)
  255. const isUpdate = values.id ? true : false
  256. await saveOrUpdate(values, isUpdate);
  257. //关闭弹窗
  258. emit('success');
  259. }
  260. }
  261. function setFieldsValue(values) {
  262. if(values){
  263. Object.keys(values).map(k=>{
  264. formData[k] = values[k];
  265. });
  266. }
  267. }
  268. /**
  269. * 值改变事件触发-树控件回调
  270. * @param key
  271. * @param value
  272. */
  273. function handleFormChange(key, value) {
  274. formData[key] = value;
  275. }
  276. //产品明细-删除行
  277. async function handleDelete1(prop) {
  278. var newArray = [...paymentDetailsTable.dataSource]
  279. newArray.splice(prop.rowIndex, 1)
  280. paymentDetailsTable.dataSource = newArray
  281. // if( paymentDetailsTable.dataSource.length!==0){
  282. // var arr = []
  283. // paymentDetailsTable.dataSource.map(item=>{
  284. // if(item.sourceId){
  285. // arr.push(item.sourceId)
  286. // }
  287. // })
  288. // if(arr.length==0){
  289. // formData.sourceCode=''
  290. // notAllowEdit.value=false
  291. // }
  292. // }else{
  293. // formData.sourceCode=''
  294. // notAllowEdit.value=false
  295. // }
  296. }
  297. function changeValues(prop){
  298. }
  299. function selectOrder(){
  300. SelectPurchaseOrderModalRef.value.getTableFromPurPayRequestForm()
  301. }
  302. function addDetailList(data){
  303. data.map(item=>{
  304. item.sourceId = item.childId
  305. item.purchaseCode = item.billCode
  306. item.purchaseId = item.id
  307. item.orderMoney = item.taxAmount
  308. })
  309. var arrSonFormDelivery = data.concat(paymentDetailsTable.dataSource)
  310. paymentDetailsTable.dataSource=arrSonFormDelivery
  311. }
  312. async function changeSupplier(value){
  313. var param={id:value}
  314. var result=await supplierOption(param)
  315. formData.supplierName =result.records[0].name
  316. }
  317. return {
  318. supplierOption,
  319. paymentDetailsTableRef,
  320. paymentDetailsTable,
  321. validatorRules,
  322. validateInfos,
  323. activeKey,
  324. loading,
  325. formData,
  326. setFieldsValue,
  327. handleFormChange,
  328. formItemLayout,
  329. disabled,
  330. getFormData,
  331. submitForm,
  332. add,
  333. edit,
  334. formRef,
  335. handleDelete1,
  336. notAllowEdit,
  337. changeValues,
  338. SelectPurchaseOrderModalRef,
  339. selectOrder,
  340. addDetailList,
  341. changeSupplier
  342. }
  343. }
  344. });
  345. </script>
  346. <style lang="less" scoped>
  347. /** 时间和数字输入框样式 */
  348. :deep(.ant-input-number) {
  349. width: 100%;
  350. }
  351. :deep(.ant-calendar-picker) {
  352. width: 100%;
  353. }
  354. /deep/.vxe-table--body-wrapper{
  355. height: 100% !important;
  356. }
  357. /deep/.ant-modal-body{
  358. padding: 24px !important;
  359. }
  360. /deep/.ant-form-item{
  361. margin-bottom: 8px !important;
  362. }
  363. </style>