ErpSupplierInfoTab.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <template>
  2. <div class="tab-content">
  3. <div class="info-section">
  4. <div class="section-title-row">
  5. <div class="section-title-left">
  6. <span class="section-title-text">ERP供应商信息</span>
  7. </div>
  8. <el-button v-if="!isViewMode" type="primary" icon="Document" @click="onSaveClick">保存</el-button>
  9. </div>
  10. <el-form ref="erpFormRef" :model="erpForm" :rules="erpFormRules" label-width="120px" class="detail-form">
  11. <el-row :gutter="12" class="form-row">
  12. <el-col :span="8">
  13. <el-form-item label="采购人员:" prop="purchaseId">
  14. <el-select v-model="erpForm.purchaseId" placeholder="请选择采购人员" class="w-full" filterable :disabled="isViewMode">
  15. <el-option v-for="item in erpStaffList" :key="item.staffId" :label="`${item.staffCode} , ${item.staffName}`" :value="item.staffId" />
  16. </el-select>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="8">
  20. <el-form-item label="采购开票类型:" prop="purchaseInvoiceNo">
  21. <el-select
  22. v-model="erpForm.purchaseInvoiceNo"
  23. placeholder="采购开票类型"
  24. class="w-full"
  25. filterable
  26. :disabled="isViewMode"
  27. @change="handInvoiceChange"
  28. >
  29. <el-option v-for="item in purchaseInvoice" :key="item.value" :label="item.label" :value="item.value" />
  30. </el-select>
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="8">
  34. <el-form-item label="单价含税:">
  35. <el-select v-model="erpForm.unitPrice" placeholder="单价含税" class="w-full" filterable disabled>
  36. <el-option v-for="item in unitPriceArr" :key="item.value" :label="item.label" :value="item.value" />
  37. </el-select>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row :gutter="12" class="form-row">
  42. <el-col :span="8">
  43. <el-form-item label="税码:">
  44. <el-select v-model="erpForm.rateId" placeholder="税码" class="w-full" filterable disabled>
  45. <el-option v-for="item in taxrateList" :key="item.id" :label="item.taxrateNo" :value="item.id" />
  46. </el-select>
  47. </el-form-item>
  48. </el-col>
  49. <el-col :span="8">
  50. <el-form-item label="交易币别:">
  51. <el-select v-model="erpForm.dealCurrencyId" placeholder="请选择交易币别" class="w-full" filterable disabled>
  52. <el-option v-for="item in currencyList" :key="item.id" :label="item.currencyName" :value="item.id" />
  53. </el-select>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="8">
  57. <el-form-item label="账款归属:">
  58. <el-input :model-value="supplierNo" disabled />
  59. </el-form-item>
  60. </el-col>
  61. </el-row>
  62. <el-row :gutter="12" class="form-row">
  63. <el-col :span="8">
  64. <el-form-item label="付款条件:">
  65. <el-select v-model="erpForm.settlementMethod" placeholder="请选择付款条件" class="w-full" filterable disabled>
  66. <el-option v-for="dict in payment_clause" :key="dict.value" :label="dict.label" :value="dict.value" />
  67. </el-select>
  68. </el-form-item>
  69. </el-col>
  70. </el-row>
  71. </el-form>
  72. </div>
  73. </div>
  74. </template>
  75. <script setup lang="ts">
  76. import { ElMessage, type FormInstance, type FormRules } from 'element-plus';
  77. import { listErpSupplierInfo, addErpSupplierInfo, updateErpSupplierInfo } from '@/api/supplier/erpSupplierInfo';
  78. import type { ErpSupplierInfoForm } from '@/api/supplier/erpSupplierInfo/types';
  79. import { listErpStaff } from '@/api/erpData/erpStaff';
  80. import type { ErpStaffVO } from '@/api/erpData/erpStaff/types';
  81. import { listComCurrency } from '@/api/company/comCurrency';
  82. import { listTaxrate } from '@/api/company/taxrate';
  83. import type { ComCurrencyVO } from '@/api/company/comCurrency/types';
  84. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  85. const { payment_clause } = toRefs<any>(proxy?.useDict('payment_clause'));
  86. const props = defineProps<{
  87. supplierId?: string | number;
  88. supplierNo?: string;
  89. isViewMode: boolean;
  90. }>();
  91. const emit = defineEmits<{
  92. (e: 'saved'): void;
  93. }>();
  94. const erpFormRef = ref<FormInstance>();
  95. const erpStaffList = ref<ErpStaffVO[]>([]);
  96. const taxrateList = ref<any[]>([]);
  97. const currencyList = ref<ComCurrencyVO[]>([]);
  98. const erpForm = reactive<ErpSupplierInfoForm>({
  99. id: undefined,
  100. supplierId: undefined,
  101. purchaseId: undefined,
  102. belongingDepartmentId: undefined,
  103. status: undefined,
  104. remark: undefined,
  105. unitPrice: 'True',
  106. dealCurrencyId: undefined,
  107. accountBelong: undefined,
  108. rateId: undefined,
  109. purchaseInvoiceId: undefined,
  110. purchaseInvoiceNo: undefined,
  111. purchaseInvoice: undefined,
  112. settlementMethod: undefined
  113. });
  114. const erpFormRules: FormRules = {
  115. purchaseId: [{ required: true, message: '请选择采购人员', trigger: 'change' }],
  116. purchaseInvoiceNo: [{ required: true, message: '请选择采购开票类型', trigger: 'change' }]
  117. };
  118. const unitPriceArr = ref([
  119. { label: '含税', value: 'True' },
  120. { label: '不含税', value: 'False' }
  121. ]);
  122. const purchaseInvoice = ref([
  123. { label: '优易达专票', value: '0001' },
  124. { label: '江西优易云普票', value: '0016' },
  125. { label: '江西优易云专票', value: '0006' },
  126. { label: '无票', value: '0017' },
  127. { label: '新天利泰专票', value: '0003' },
  128. { label: '优易达(长沙)-普票', value: '0019' },
  129. { label: '优易达(长沙)-专票', value: '0018' },
  130. { label: '优易达普票', value: '0010' },
  131. { label: '优易智采(江西)-专票', value: '0020' }
  132. ]);
  133. const handInvoiceChange = (invoiceNo: any) => {
  134. const invoice = purchaseInvoice.value.find((item) => item.value === invoiceNo);
  135. erpForm.purchaseInvoice = invoice?.label;
  136. };
  137. // 加载税码列表并设默认值
  138. const loadTaxrateList = async () => {
  139. try {
  140. const res = await listTaxrate({
  141. isShow: '0',
  142. pageNum: 1,
  143. pageSize: 1000
  144. });
  145. taxrateList.value = res.rows || [];
  146. if (!erpForm.rateId && taxrateList.value.length > 0) {
  147. erpForm.rateId = taxrateList.value[0].id;
  148. }
  149. } catch (error) {}
  150. };
  151. // 加载币种列表并设默认值
  152. const loadCurrencyList = async () => {
  153. try {
  154. const res = await listComCurrency({
  155. isShow: '0',
  156. pageNum: 1,
  157. pageSize: 1000
  158. });
  159. currencyList.value = res.rows || [];
  160. if (!erpForm.dealCurrencyId && currencyList.value.length > 0) {
  161. erpForm.dealCurrencyId = currencyList.value[0].id;
  162. }
  163. } catch (error) {
  164. console.error('加载币种列表失败:', error);
  165. currencyList.value = [];
  166. }
  167. };
  168. // 加载员工列表
  169. const loadErpStaffList = async () => {
  170. try {
  171. const res = await listErpStaff();
  172. erpStaffList.value = res.rows || [];
  173. } catch (error) {
  174. console.error('加载员工列表失败:', error);
  175. }
  176. };
  177. // 加载已有ERP供应商信息
  178. const loadErpSupplierInfo = async () => {
  179. if (!props.supplierId) return;
  180. try {
  181. const res = await listErpSupplierInfo({ supplierId: props.supplierId, pageNum: 1, pageSize: 1 });
  182. if (res.rows && res.rows.length > 0) {
  183. const data = res.rows[0];
  184. Object.assign(erpForm, {
  185. id: data.id,
  186. supplierId: data.supplierId,
  187. purchaseId: data.purchaseId,
  188. belongingDepartmentId: data.belongingDepartmentId,
  189. status: data.status,
  190. remark: data.remark,
  191. unitPrice: data.unitPrice || 'True',
  192. dealCurrencyId: data.dealCurrencyId,
  193. accountBelong: data.accountBelong,
  194. rateId: data.rateId,
  195. purchaseInvoiceId: data.purchaseInvoiceId,
  196. purchaseInvoiceNo: data.purchaseInvoiceNo,
  197. purchaseInvoice: data.purchaseInvoice,
  198. settlementMethod: data.settlementMethod
  199. });
  200. }
  201. } catch (error) {
  202. console.error('加载ERP供应商信息失败:', error);
  203. }
  204. };
  205. // 监听付款条件字典加载完成后默认选择第一个
  206. watch(
  207. () => payment_clause.value,
  208. (val) => {
  209. if (!erpForm.settlementMethod && val && val.length > 0) {
  210. erpForm.settlementMethod = val[0].value;
  211. }
  212. },
  213. { immediate: true }
  214. );
  215. // 监听supplierId变化,重新加载ERP数据
  216. watch(
  217. () => props.supplierId,
  218. (newId) => {
  219. if (newId) {
  220. loadErpSupplierInfo();
  221. }
  222. },
  223. { immediate: true }
  224. );
  225. const onSaveClick = async () => {
  226. if (!erpFormRef.value) return;
  227. try {
  228. await erpFormRef.value.validate();
  229. } catch {
  230. return;
  231. }
  232. if (!props.supplierId) {
  233. ElMessage.warning('请先保存基本信息');
  234. return;
  235. }
  236. try {
  237. const erpData: ErpSupplierInfoForm = {
  238. ...erpForm,
  239. supplierId: props.supplierId
  240. };
  241. if (erpData.id) {
  242. await updateErpSupplierInfo(erpData);
  243. } else {
  244. await addErpSupplierInfo(erpData);
  245. // 重新加载以获取新生成的id
  246. await loadErpSupplierInfo();
  247. }
  248. ElMessage.success('ERP供应商信息保存成功');
  249. emit('saved');
  250. } catch (error) {
  251. console.error('保存ERP供应商信息失败:', error);
  252. }
  253. };
  254. onMounted(() => {
  255. loadErpStaffList();
  256. loadTaxrateList();
  257. loadCurrencyList();
  258. });
  259. </script>
  260. <style scoped>
  261. .tab-content {
  262. --el-component-size: 24px;
  263. padding: 16px;
  264. }
  265. .detail-form :deep(.el-form-item__label) {
  266. white-space: nowrap;
  267. }
  268. .detail-form :deep(.form-row) {
  269. margin-bottom: 2px;
  270. }
  271. .detail-form :deep(.el-form-item) {
  272. margin-bottom: 8px;
  273. }
  274. .tab-content :deep(.form-row) {
  275. margin-bottom: 2px;
  276. }
  277. .tab-content :deep(.el-form-item) {
  278. margin-bottom: 8px;
  279. }
  280. .tab-content :deep(.info-section) {
  281. margin-bottom: 20px;
  282. }
  283. .tab-content :deep(.section-title-row) {
  284. margin-bottom: 12px;
  285. padding-bottom: 8px;
  286. }
  287. .tab-content :deep(.section-title-text) {
  288. font-size: 14px;
  289. }
  290. .tab-content :deep(.el-form-item__label) {
  291. font-size: 13px;
  292. height: var(--el-component-size);
  293. line-height: var(--el-component-size);
  294. padding-top: 0;
  295. padding-bottom: 0;
  296. }
  297. .detail-form :deep(.el-input),
  298. .detail-form :deep(.el-select) {
  299. width: 100%;
  300. }
  301. .detail-form :deep(.el-input__wrapper),
  302. .detail-form :deep(.el-select__wrapper) {
  303. min-height: var(--el-component-size);
  304. height: var(--el-component-size);
  305. align-items: center;
  306. padding-top: 0;
  307. padding-bottom: 0;
  308. }
  309. .detail-form :deep(.el-form-item__content) {
  310. align-items: center;
  311. min-height: var(--el-component-size);
  312. }
  313. .detail-form :deep(.el-input__inner) {
  314. height: var(--el-component-size);
  315. line-height: var(--el-component-size);
  316. }
  317. .section-title-row {
  318. display: flex;
  319. justify-content: space-between;
  320. align-items: center;
  321. }
  322. .section-title-left {
  323. display: flex;
  324. align-items: baseline;
  325. gap: 4px;
  326. }
  327. .w-full {
  328. width: 100%;
  329. }
  330. </style>