purPaymentRequestForm.vue 13 KB

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