SendPurchaseWDLY.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <template>
  2. <div style="width: 100%; padding: 0px 15px">
  3. <el-form
  4. :model="formData.data"
  5. :rules="rules"
  6. ref="formDom"
  7. label-position="top"
  8. :disabled='props.queryData.purchaseDetailList ? true : false'
  9. >
  10. <div class="_t">基础信息</div>
  11. <el-row :gutter="10">
  12. <el-col :span="6">
  13. <el-form-item label="采购部门" prop="deptName">
  14. <el-input v-model="formData.data.deptName" placeholder="请输入">
  15. </el-input>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="6">
  19. <el-form-item label="采购人" prop="purchaseName">
  20. <el-input v-model="formData.data.purchaseName" placeholder="请输入">
  21. </el-input>
  22. </el-form-item>
  23. </el-col>
  24. <el-col :span="6">
  25. <el-form-item label="采购时间" prop="purchaseTime">
  26. <el-date-picker
  27. v-model="formData.data.purchaseTime"
  28. type="datetime"
  29. placeholder="请选择"
  30. />
  31. </el-form-item>
  32. </el-col>
  33. </el-row>
  34. <el-row :gutter="10">
  35. <el-col :span="6">
  36. <el-form-item label="供应商" prop="supplyId">
  37. <el-select
  38. v-model="formData.data.supplyId"
  39. placeholder="请选择"
  40. @change="handleChangeSupplier"
  41. filterable
  42. style="width: 100%"
  43. >
  44. <el-option
  45. v-for="item in supplierData"
  46. :label="item.name"
  47. :value="item.id"
  48. >
  49. </el-option>
  50. </el-select>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="6">
  54. <el-form-item label="是否合同" prop="isAgreement">
  55. <el-select
  56. v-model="formData.data.isAgreement"
  57. placeholder="请选择"
  58. style="width: 100%"
  59. >
  60. <el-option label="是" value="1"> </el-option>
  61. <el-option label="否" value="0"> </el-option>
  62. </el-select>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="6">
  66. <el-form-item label="付款方式" prop="paymentMethod">
  67. <el-select
  68. v-model="formData.data.paymentMethod"
  69. placeholder="请选择"
  70. filterable
  71. style="width: 100%"
  72. >
  73. <el-option
  74. v-for="item in fundsPaymentMethod"
  75. :label="item.dictValue"
  76. :value="item.dictKey"
  77. >
  78. </el-option>
  79. </el-select>
  80. </el-form-item>
  81. </el-col>
  82. <el-col :span="6">
  83. <el-form-item label="合同编号" prop="contractCode">
  84. <el-input
  85. v-model="formData.data.contractCode"
  86. placeholder="请输入"
  87. >
  88. </el-input>
  89. </el-form-item>
  90. </el-col>
  91. </el-row>
  92. <el-form-item label="采购说明" prop="purchaseContent">
  93. <el-input
  94. v-model="formData.data.purchaseContent"
  95. placeholder="请输入"
  96. type="textarea"
  97. >
  98. </el-input>
  99. </el-form-item>
  100. <div class="_t">采购明细</div>
  101. <el-form-item>
  102. <el-button
  103. type="primary"
  104. @click="openProduct = true"
  105. style="margin: 10px 0"
  106. v-if="ids.length == 0"
  107. >
  108. 添加物品
  109. </el-button>
  110. <el-table :data="formData.data.purchaseDetailList">
  111. <el-table-column
  112. prop="goodType"
  113. label="物品类型"
  114. :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')"
  115. />
  116. <el-table-column prop="productCode" label="物品编码" />
  117. <el-table-column prop="productName" label="物品名称" />
  118. <!-- <el-table-column prop="productSpec" label="规格型号" /> -->
  119. <el-table-column prop="productUnit" label="单位" />
  120. <el-table-column
  121. prop="subscribeCount"
  122. label="申购数量"
  123. v-if="ids.length > 0"
  124. />
  125. <el-table-column
  126. prop="purchaseCount"
  127. label="已采购数量"
  128. v-if="ids.length > 0"
  129. />
  130. <el-table-column prop="count" label="本次采购" min-width="150">
  131. <template #default="{ row, $index }">
  132. <el-form-item
  133. :prop="'purchaseDetailList.' + $index + '.count'"
  134. :rules="rules.count"
  135. :inline-message="true"
  136. >
  137. <el-input-number
  138. v-model="row.count"
  139. :precision="4"
  140. :controls="false"
  141. :min="0"
  142. @change="handleChangeAmount"
  143. />
  144. </el-form-item>
  145. </template>
  146. </el-table-column>
  147. <el-table-column prop="price" label="单价" min-width="150">
  148. <template #default="{ row, $index }">
  149. <el-form-item
  150. :prop="'purchaseDetailList.' + $index + '.price'"
  151. :rules="rules.price"
  152. :inline-message="true"
  153. >
  154. <el-input-number
  155. v-model="row.price"
  156. :precision="4"
  157. :controls="false"
  158. :min="0"
  159. @change="handleChangeAmount"
  160. />
  161. </el-form-item>
  162. </template>
  163. </el-table-column>
  164. <el-table-column prop="amount" label="金额" />
  165. <el-table-column prop="zip" label="操作" width="100">
  166. <template #default="{ $index }">
  167. <el-button type="primary" link @click="handleRemove($index, 20)"
  168. >删除</el-button
  169. >
  170. </template>
  171. </el-table-column>
  172. </el-table>
  173. </el-form-item>
  174. <div class="_t">其他费用</div>
  175. <el-form-item>
  176. <el-button type="primary" style="margin: 10px 0" @click="handleAdd">
  177. 添加
  178. </el-button>
  179. <el-table :data="formData.data.otherFeeList">
  180. <el-table-column prop="name" label="费用名称" min-width="150">
  181. <template #default="{ row, $index }">
  182. <el-form-item
  183. :prop="'otherFeeList.' + $index + '.name'"
  184. :rules="rulesOne.name"
  185. :inline-message="true"
  186. >
  187. <el-input v-model="row.name" placeholder="请输入" />
  188. </el-form-item>
  189. </template>
  190. </el-table-column>
  191. <el-table-column prop="price" label="金额" min-width="150">
  192. <template #default="{ row, $index }">
  193. <el-form-item
  194. :prop="'otherFeeList.' + $index + '.price'"
  195. :rules="rulesOne.price"
  196. :inline-message="true"
  197. >
  198. <el-input-number
  199. v-model="row.price"
  200. :precision="4"
  201. :controls="false"
  202. :min="0"
  203. @change="handleChangeAmount"
  204. />
  205. </el-form-item>
  206. </template>
  207. </el-table-column>
  208. <el-table-column prop="remark" label="备注" min-width="150">
  209. <template #default="{ row, $index }">
  210. <el-form-item
  211. :prop="'otherFeeList.' + $index + '.remark'"
  212. :inline-message="true"
  213. >
  214. <el-input v-model="row.remark" placeholder="请输入" />
  215. </el-form-item>
  216. </template>
  217. </el-table-column>
  218. <el-table-column prop="zip" label="操作" width="100">
  219. <template #default="{ $index }">
  220. <el-button type="primary" link @click="handleRemove($index, 10)"
  221. >删除</el-button
  222. >
  223. </template>
  224. </el-table-column>
  225. </el-table>
  226. </el-form-item>
  227. <div class="_t" style="margin-bottom: 15px">采购总金额</div>
  228. <el-row>
  229. <el-col :span="4">
  230. <el-form-item label="采购总金额" prop="amount">
  231. <el-input
  232. v-model="formData.data.amount"
  233. placeholder="请输入"
  234. disabled
  235. />
  236. </el-form-item>
  237. </el-col>
  238. </el-row>
  239. </el-form>
  240. <el-dialog
  241. v-model="openProduct"
  242. title="选择物品"
  243. width="70%"
  244. append-to-body
  245. >
  246. <SelectGoods
  247. @cancel="openProduct = false"
  248. @pushGoods="pushGoods"
  249. ></SelectGoods>
  250. </el-dialog>
  251. </div>
  252. </template>
  253. <script setup>
  254. import SelectGoods from "@/components/product/SelectGoods";
  255. import { ElMessage, ElMessageBox } from "element-plus";
  256. import useUserStore from "@/store/modules/user";
  257. import { useRouter, useRoute } from "vue-router";
  258. const { proxy } = getCurrentInstance();
  259. const route = useRoute();
  260. let formData = reactive({
  261. data: {
  262. purchaseTime: "",
  263. purchaseDetailList: [],
  264. otherFeeList: [],
  265. },
  266. });
  267. let rules = ref({
  268. deptName: [{ required: true, message: "请输入采购部门", trigger: "blur" }],
  269. purchaseName: [
  270. { required: true, message: "请输入采购人名称", trigger: "blur" },
  271. ],
  272. purchaseTime: [
  273. { required: true, message: "请选择采购时间", trigger: "change" },
  274. ],
  275. supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
  276. count: [{ required: true, message: "请输入本次采购数量", trigger: "blur" }],
  277. price: [{ required: true, message: "请输入单价", trigger: "blur" }],
  278. remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
  279. isAgreement: [
  280. { required: true, message: "请选择是否合同", trigger: "change" },
  281. ],
  282. paymentMethod: [
  283. { required: true, message: "请选择付款方式", trigger: "change" },
  284. ],
  285. });
  286. let rulesOne = ref({
  287. name: [{ required: true, message: "请输入费用名称", trigger: "blur" }],
  288. price: [{ required: true, message: "请输入金额", trigger: "blur" }],
  289. });
  290. let openProduct = ref(false);
  291. const handleAdd = () => {
  292. formData.data.otherFeeList.push({
  293. name: "",
  294. price: 0,
  295. remark: "",
  296. });
  297. };
  298. // 物品相应逻辑
  299. const handleRemove = (index, type) => {
  300. if (type == 10) {
  301. formData.data.otherFeeList.splice(index, 1);
  302. } else if (type == 20) {
  303. formData.data.purchaseDetailList.splice(index, 1);
  304. }
  305. handleChangeAmount();
  306. return ElMessage({
  307. message: "删除成功!",
  308. type: "success",
  309. });
  310. };
  311. const pushGoods = (goods) => {
  312. const arr = goods.map((x) => ({
  313. goodType: x.goodType,
  314. productCode: x.code,
  315. productName: x.name,
  316. productSpec: x.spec,
  317. productUnit: x.unit,
  318. count: 0,
  319. price: 0,
  320. bussinessId: x.id,
  321. amount: 0,
  322. }));
  323. formData.data.purchaseDetailList =
  324. formData.data.purchaseDetailList.concat(arr);
  325. openProduct.value = false;
  326. return ElMessage({
  327. message: "添加成功!",
  328. type: "success",
  329. });
  330. };
  331. // 提交方法
  332. const formDom = ref(null);
  333. const handleSubmit = async () => {
  334. const vaild = await formDom.value.validate();
  335. if (vaild) {
  336. if (formData.data.purchaseDetailList.length > 0) {
  337. const list = formData.data.purchaseDetailList;
  338. for (let i = 0; i < list.length; i++) {
  339. const e = list[i];
  340. if (ids.value.length > 0) {
  341. if (Number(e.subscribeCount) - Number(e.purchaseCount) > 0) {
  342. if (e.count == 0) {
  343. ElMessage({
  344. message: "本次采购数量不能为0!",
  345. type: "info",
  346. });
  347. return false;
  348. }
  349. }
  350. if (e.count + Number(e.purchaseCount) > Number(e.subscribeCount)) {
  351. ElMessage({
  352. message: "本次采购数量和已采购数量和不可大于申购数量!",
  353. type: "info",
  354. });
  355. return false;
  356. }
  357. } else {
  358. if (e.count == 0) {
  359. ElMessage({
  360. message: "本次采购数量不能为0!",
  361. type: "info",
  362. });
  363. return false;
  364. }
  365. }
  366. }
  367. return true;
  368. }
  369. ElMessage({
  370. message: "请添加采购明细!",
  371. type: "info",
  372. });
  373. return false;
  374. }
  375. return false;
  376. };
  377. // 获取用户信息并赋默认值
  378. const userInfo = useUserStore().user;
  379. onMounted(() => {
  380. formData.data.purchaseTime = proxy.parseTime(new Date());
  381. formData.data.deptName = userInfo.dept.deptName;
  382. formData.data.purchaseName = userInfo.nickName;
  383. getSupplierList();
  384. if (!route.query.processType) {
  385. ids.value = props.queryData.ids.split(",") || [];
  386. getDetails();
  387. }
  388. setTimeout(() => {
  389. if(!props.queryData.purchaseDetailList) return
  390. alert(1231231231231231)
  391. console.log(props.queryData,'123123123kljasdjkashdkjasdh')
  392. formData.data = props.queryData
  393. proxy.post("/subscribeDetail/detail", { ids: props.queryData.purchaseDetailList.map(item => {
  394. return item.subscribeDetailId
  395. }) }).then((res) => {
  396. formData.data.purchaseDetailList = props.queryData.purchaseDetailList.map((x) => ({
  397. ...x,
  398. subscribeCount: x.count,
  399. count: x.count,
  400. price: x.price,
  401. amount: x.amount,
  402. }));
  403. });
  404. }, 2000);
  405. });
  406. // 接收父组件的传值
  407. const props = defineProps({
  408. queryData: String,
  409. });
  410. const ids = ref([]);
  411. const getDetails = () => {
  412. proxy.post("/subscribeDetail/detail", { ids: ids.value }).then((res) => {
  413. console.log(res,'123123123123123123123123')
  414. formData.data.purchaseDetailList = res.map((x) => ({
  415. ...x,
  416. subscribeCount: x.count,
  417. count: Number(x.count) - Number(x.purchaseCount),
  418. price: null,
  419. amount: null,
  420. }));
  421. });
  422. };
  423. // 获取用户信息并赋默认值
  424. // const tenantId = "@福建宏星!#¥%……&*()";
  425. const tenantId = userInfo.tenantId;
  426. // 获取供应商数据
  427. const supplierData = ref([]);
  428. const fundsPaymentMethod = ref([]);
  429. const getSupplierList = async (req) => {
  430. proxy
  431. .post("/supplierInfo/page", { pageNum: 1, pageSize: 9999 })
  432. .then((res) => {
  433. supplierData.value = res.rows;
  434. });
  435. proxy
  436. .post("/dictTenantData/page", {
  437. pageNum: 1,
  438. pageSize: 999,
  439. tenantId: tenantId,
  440. dictCode: "funds_payment_method",
  441. })
  442. .then((res) => {
  443. fundsPaymentMethod.value = res.rows;
  444. });
  445. };
  446. // 供应商改变逻辑
  447. const handleChangeSupplier = (val) => {
  448. const ids = formData.data.purchaseDetailList.map((x) => x.bussinessId);
  449. proxy
  450. .post("/supplierPrice/getSupplierPriceByProductIds", {
  451. supplierInfoId: val,
  452. productIdList: ids,
  453. })
  454. .then((res) => {
  455. if (Object.keys(res).length > 0) {
  456. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  457. const e = formData.data.purchaseDetailList[i];
  458. for (const key in res) {
  459. if (e.bussinessId === key) {
  460. e.price = Number(res[key]);
  461. } else e.price = null;
  462. }
  463. }
  464. } else {
  465. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  466. const e = formData.data.purchaseDetailList[i];
  467. e.price = 0;
  468. }
  469. }
  470. handleChangeAmount();
  471. });
  472. };
  473. // 计算采购总金额
  474. const handleChangeAmount = () => {
  475. let sum = 0;
  476. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  477. const e = formData.data.purchaseDetailList[i];
  478. e.amount = e.count * e.price;
  479. sum += e.amount;
  480. }
  481. for (let i = 0; i < formData.data.otherFeeList.length; i++) {
  482. const e = formData.data.otherFeeList[i];
  483. sum += e.price;
  484. }
  485. formData.data.amount = sum;
  486. };
  487. // 向父组件暴露
  488. defineExpose({
  489. submitData: formData.data,
  490. handleSubmit,
  491. });
  492. </script>
  493. <style lang="scss" scoped>
  494. ._t {
  495. margin-bottom: 5px;
  496. font-size: 14px;
  497. }
  498. </style>