add.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <template>
  2. <div class="form">
  3. <van-nav-bar
  4. title="手动出库"
  5. left-text="返回"
  6. left-arrow
  7. @click-left="onClickLeft"
  8. >
  9. </van-nav-bar>
  10. <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px">
  11. <van-cell-group inset>
  12. <van-field
  13. v-model="formData.warehouseName"
  14. is-link
  15. readonly
  16. label="仓库名称"
  17. placeholder="选择仓库名称"
  18. @click="typeModal = true"
  19. :rules="[{ required: true, message: '仓库名称不能为空' }]"
  20. required
  21. />
  22. <van-popup v-model:show="typeModal" round position="bottom">
  23. <van-picker
  24. :columns="columns"
  25. @cancel="typeModal = false"
  26. @confirm="onConfirm"
  27. />
  28. </van-popup>
  29. <!-- 明细列表 -->
  30. <div v-for="(item, index) in list" :key="index">
  31. <div class="commons-delete">
  32. <div class="title">明细{{ index + 1 }}</div>
  33. <div
  34. class="delete"
  35. @click.native="handleDel(index)"
  36. v-if="!route.query.id"
  37. >
  38. <van-icon name="cross" />
  39. </div>
  40. </div>
  41. <van-field
  42. v-model="list[index].productName"
  43. is-link
  44. readonly
  45. label="物品名称"
  46. placeholder="选择物品名称"
  47. @click="handleSelect(index)"
  48. :rules="[{ required: true, message: '物品名称不能为空' }]"
  49. required
  50. />
  51. <van-field
  52. v-model="list[index].quantity"
  53. label="出库数量"
  54. placeholder="请输入出库数量"
  55. :rules="[{ required: true, message: '出库数量不能为空' }]"
  56. required
  57. />
  58. </div>
  59. <van-popup v-model:show="typeModalOne" round position="bottom">
  60. <van-picker
  61. :columns="columnsOne"
  62. @cancel="typeModalOne = false"
  63. @confirm="(data) => onConfirmOne(data, index)"
  64. />
  65. </van-popup>
  66. </van-cell-group>
  67. <div class="commons-add-btn" v-if="!route.query.id">
  68. <van-button
  69. icon="plus"
  70. type="default"
  71. size="small"
  72. style="margin-top: 10px"
  73. block
  74. @click="handleAddRow"
  75. >添加明细</van-button
  76. >
  77. </div>
  78. <div style="margin: 16px" v-if="!route.query.id">
  79. <van-button round block type="primary" native-type="submit">
  80. 提交
  81. </van-button>
  82. </div>
  83. </van-form>
  84. </div>
  85. </template>
  86. <script setup>
  87. import { ref, getCurrentInstance, onMounted } from "vue";
  88. import { showSuccessToast, showFailToast } from "vant";
  89. import { useRoute } from "vue-router";
  90. const proxy = getCurrentInstance().proxy;
  91. const route = useRoute();
  92. const showPicker = ref(false);
  93. const typeModal = ref(false);
  94. const typeModalOne = ref(false);
  95. let selectIndex = ref(null);
  96. const formData = ref({
  97. warehouseId: "",
  98. type: "2",
  99. warehouseName: "",
  100. });
  101. const list = ref([]);
  102. const handleAddRow = () => {
  103. list.value.push({
  104. productId: "",
  105. productName: "",
  106. quantity: "",
  107. });
  108. };
  109. const getDetails = (id) => {
  110. proxy.post("/stockJournal/detail", { id }).then((res) => {
  111. console.log(res, "www");
  112. formData.value = res.data;
  113. list.value = res.data.list.map((x) => ({
  114. productId: x.productId,
  115. productName: x.productName,
  116. quantity: x.quantity,
  117. }));
  118. });
  119. };
  120. const getDict = () => {
  121. proxy.post("/warehouse/page", { pageNum: 1, pageSize: 9999 }).then((res) => {
  122. columns.value = res.data.rows.map((item) => {
  123. return {
  124. text: item.name,
  125. value: item.id,
  126. };
  127. });
  128. // formData.value.warehouseName = formData.value.warehouseId
  129. // ? columns.value.find((item) => item.value == formData.value.warehouseId).name
  130. // : null;
  131. });
  132. proxy
  133. .post("/productInfo/page", { pageNum: 1, pageSize: 9999, definition: "" })
  134. .then((res) => {
  135. columnsOne.value = res.data.rows.map((item) => {
  136. return {
  137. text: item.name,
  138. value: item.id,
  139. };
  140. });
  141. // formData.value.warehouseName = formData.value.warehouseId
  142. // ? columns.value.find((item) => item.value == formData.value.warehouseId).name
  143. // : null;
  144. });
  145. };
  146. const columns = ref([]);
  147. const columnsOne = ref([]);
  148. const onConfirm = ({ selectedOptions }) => {
  149. formData.value.warehouseId = selectedOptions[0].value;
  150. formData.value.warehouseName = selectedOptions[0].text;
  151. typeModal.value = false;
  152. };
  153. const onConfirmOne = ({ selectedOptions }, index) => {
  154. list.value[selectIndex.value].productId = selectedOptions[0].value;
  155. list.value[selectIndex.value].productName = selectedOptions[0].text;
  156. typeModalOne.value = false;
  157. };
  158. const handleSelect = (index) => {
  159. selectIndex.value = index;
  160. typeModalOne.value = true;
  161. };
  162. const handleDel = (index) => {
  163. list.value.splice(index, 1);
  164. };
  165. const onClickLeft = () => history.back();
  166. const onSubmit = () => {
  167. if (!list.value.length > 0) return showFailToast("请添加明细!");
  168. formData.value.list = list.value.map((x) => ({
  169. productId: x.productId,
  170. quantity: x.quantity,
  171. }));
  172. formData.value.type = "2";
  173. proxy.post("/stock/edit", formData.value).then(
  174. (res) => {
  175. setTimeout(() => {
  176. showSuccessToast("出库成功");
  177. proxy.$router.push("/main/manualOutbound");
  178. }, 500);
  179. },
  180. (err) => {
  181. return showFailToast(err.message);
  182. }
  183. );
  184. };
  185. onMounted(() => {
  186. if(route.query.id) getDetails(route.query.id);
  187. getDict();
  188. });
  189. </script>
  190. <style lang="scss" scoped>
  191. .row {
  192. display: flex;
  193. padding: 5px 10px 0 10px;
  194. justify-content: space-between;
  195. align-items: center;
  196. .title {
  197. flex: 1;
  198. }
  199. .delete {
  200. width: 20px;
  201. cursor: pointer;
  202. text-align: center;
  203. }
  204. }
  205. </style>