SendPurchase.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. <template>
  2. <div>
  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>
  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>
  34. <el-col :span="8">
  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-row>
  53. <el-form-item label="采购说明" prop="purchaseContent">
  54. <el-input
  55. v-model="formData.data.purchaseContent"
  56. placeholder="请输入"
  57. type="textarea"
  58. >
  59. </el-input>
  60. </el-form-item>
  61. <div class="_t">采购明细</div>
  62. <el-form-item>
  63. <el-button
  64. type="primary"
  65. @click="openProduct = true"
  66. style="margin: 10px 0"
  67. v-if="ids.length == 0"
  68. >
  69. 添加货品
  70. </el-button>
  71. <el-table :data="formData.data.purchaseDetailList">
  72. <el-table-column
  73. prop="goodType"
  74. label="货品类型"
  75. :formatter="(row) => (row.goodType == 1 ? '产品' : '物料')"
  76. />
  77. <el-table-column prop="productCode" label="货品编码" />
  78. <el-table-column prop="productName" label="货品名称" />
  79. <el-table-column prop="productSpec" label="规格型号" />
  80. <el-table-column prop="productUnit" label="单位" />
  81. <el-table-column
  82. prop="subscribeCount"
  83. label="申购数量"
  84. v-if="ids.length > 0"
  85. />
  86. <el-table-column
  87. prop="purchaseCount"
  88. label="已采购数量"
  89. v-if="ids.length > 0"
  90. />
  91. <el-table-column prop="count" label="本次采购" min-width="150">
  92. <template #default="{ row, $index }">
  93. <el-form-item
  94. :prop="'purchaseDetailList.' + $index + '.count'"
  95. :rules="rules.count"
  96. :inline-message="true"
  97. >
  98. <el-input-number
  99. v-model="row.count"
  100. :precision="4"
  101. :controls="false"
  102. :min="0"
  103. @change="handleChangeAmount"
  104. />
  105. </el-form-item>
  106. </template>
  107. </el-table-column>
  108. <el-table-column prop="price" label="单价" min-width="150">
  109. <template #default="{ row, $index }">
  110. <el-form-item
  111. :prop="'purchaseDetailList.' + $index + '.price'"
  112. :rules="rules.price"
  113. :inline-message="true"
  114. >
  115. <el-input-number
  116. v-model="row.price"
  117. :precision="4"
  118. :controls="false"
  119. :min="0"
  120. @change="handleChangeAmount"
  121. />
  122. </el-form-item>
  123. </template>
  124. </el-table-column>
  125. <el-table-column prop="amount" label="金额" />
  126. <el-table-column prop="zip" label="操作" width="100">
  127. <template #default="{ $index }">
  128. <el-button type="primary" link @click="handleRemove($index)"
  129. >删除</el-button
  130. >
  131. </template>
  132. </el-table-column>
  133. </el-table>
  134. </el-form-item>
  135. <el-row>
  136. <el-col :span="4">
  137. <el-form-item label="采购金额" prop="amount">
  138. <el-input
  139. v-model="formData.data.amount"
  140. placeholder="请输入"
  141. disabled
  142. />
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. </el-form>
  147. </div>
  148. <el-dialog v-model="openProduct" title="选择货品" width="70%" append-to-body>
  149. <SelectGoods
  150. @cancel="openProduct = false"
  151. @pushGoods="pushGoods"
  152. ></SelectGoods>
  153. </el-dialog>
  154. </template>
  155. <script setup>
  156. import SelectGoods from "@/components/product/SelectGoods";
  157. import { ElMessage, ElMessageBox } from "element-plus";
  158. import useUserStore from "@/store/modules/user";
  159. const { proxy } = getCurrentInstance();
  160. let formData = reactive({
  161. data: {
  162. purchaseTime: "",
  163. purchaseDetailList: [],
  164. },
  165. });
  166. let rules = ref({
  167. deptName: [{ required: true, message: "请输入采购部门", trigger: "blur" }],
  168. purchaseName: [
  169. { required: true, message: "请输入采购人名称", trigger: "blur" },
  170. ],
  171. purchaseTime: [
  172. { required: true, message: "请选择采购时间", trigger: "change" },
  173. ],
  174. supplyId: [{ required: true, message: "请选择供应商", trigger: "change" }],
  175. count: [{ required: true, message: "请输入本次采购数量", trigger: "blur" }],
  176. price: [{ required: true, message: "请输入单价", trigger: "blur" }],
  177. remark: [{ required: true, message: "请输入备注", trigger: "blur" }],
  178. });
  179. let openProduct = ref(false);
  180. // 物品相应逻辑
  181. const handleRemove = (index) => {
  182. formData.data.purchaseDetailList.splice(index, 1);
  183. return ElMessage({
  184. message: "删除成功!",
  185. type: "success",
  186. });
  187. };
  188. const pushGoods = (goods) => {
  189. const arr = goods.map((x) => ({
  190. goodType: x.goodType,
  191. productCode: x.code,
  192. productName: x.name,
  193. productSpec: x.spec,
  194. productUnit: x.unit,
  195. count: 0,
  196. price: 0,
  197. bussinessId: x.id,
  198. amount: 0,
  199. }));
  200. formData.data.purchaseDetailList =
  201. formData.data.purchaseDetailList.concat(arr);
  202. return ElMessage({
  203. message: "添加成功!",
  204. type: "success",
  205. });
  206. };
  207. // 提交方法
  208. const formDom = ref(null);
  209. const handleSubmit = async () => {
  210. const vaild = await formDom.value.validate();
  211. if (vaild) {
  212. if (formData.data.purchaseDetailList.length > 0) {
  213. const list = formData.data.purchaseDetailList;
  214. for (let i = 0; i < list.length; i++) {
  215. const e = list[i];
  216. if (ids.value.length > 0) {
  217. if (Number(e.subscribeCount) - Number(e.purchaseCount) > 0) {
  218. if (e.count == 0) {
  219. ElMessage({
  220. message: "本次采购数量不能为0!",
  221. type: "info",
  222. });
  223. return false;
  224. }
  225. }
  226. if (e.count + Number(e.purchaseCount) > Number(e.subscribeCount)) {
  227. ElMessage({
  228. message: "本次采购数量和已采购数量和不可大于申购数量!",
  229. type: "info",
  230. });
  231. return false;
  232. }
  233. } else {
  234. if (e.count == 0) {
  235. ElMessage({
  236. message: "本次采购数量不能为0!",
  237. type: "info",
  238. });
  239. return false;
  240. }
  241. }
  242. }
  243. return true;
  244. }
  245. ElMessage({
  246. message: "请添加采购明细!",
  247. type: "info",
  248. });
  249. return false;
  250. }
  251. return false;
  252. };
  253. // 获取用户信息并赋默认值
  254. const userInfo = useUserStore().user;
  255. onMounted(() => {
  256. formData.data.purchaseTime = proxy.parseTime(new Date());
  257. formData.data.deptName = userInfo.dept.deptName;
  258. formData.data.purchaseName = userInfo.nickName;
  259. getSupplierList();
  260. if (props.queryData.ids) {
  261. ids.value = props.queryData.ids.split(",") || [];
  262. getDetails();
  263. }
  264. });
  265. // 接收父组件的传值
  266. const props = defineProps({
  267. queryData: String,
  268. });
  269. const ids = ref([]);
  270. const getDetails = () => {
  271. proxy.post("/subscribeDetail/detail", { ids: ids.value }).then((res) => {
  272. formData.data.purchaseDetailList = res.map((x) => ({
  273. ...x,
  274. subscribeCount: x.count,
  275. count: 0,
  276. price: null,
  277. amount: null,
  278. }));
  279. });
  280. };
  281. // 获取供应商数据
  282. const supplierData = ref([]);
  283. const getSupplierList = async (req) => {
  284. proxy
  285. .post("/supplierInfo/page", { pageNum: 1, pageSize: 9999 })
  286. .then((res) => {
  287. supplierData.value = res.rows;
  288. });
  289. };
  290. // 供应商改变逻辑
  291. const handleChangeSupplier = (val) => {
  292. console.log(val, "as");
  293. };
  294. // 计算采购总金额
  295. const handleChangeAmount = () => {
  296. let sum = 0;
  297. for (let i = 0; i < formData.data.purchaseDetailList.length; i++) {
  298. const e = formData.data.purchaseDetailList[i];
  299. e.amount = e.count * e.price;
  300. sum += e.amount;
  301. }
  302. formData.data.amount = sum;
  303. };
  304. // 向父组件暴露
  305. defineExpose({
  306. submitData: formData.data,
  307. handleSubmit,
  308. });
  309. </script>
  310. <style lang="scss" scoped>
  311. ._t {
  312. margin-bottom: 5px;
  313. font-size: 14px;
  314. }
  315. </style>