SendPurchaseWDLY.vue 14 KB

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