add.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <template>
  2. <div class="form">
  3. <van-nav-bar title="供应商管理" left-text="返回" left-arrow @click-left="onClickLeft"> </van-nav-bar>
  4. <van-form @submit="onSubmit" label-align="top" style="margin-top: 20px; overflow-y: auto">
  5. <van-cell-group inset>
  6. <van-field v-model="formData.typeName" is-link readonly label="供应商类型" placeholder="请选择供应商类型"
  7. @click="typeModal = true" :rules="[{ required: true, message: '供应商类型不能为空' }]" required />
  8. <van-popup v-model:show="typeModal" position="bottom">
  9. <van-picker :columns="classification" @confirm="onConfirmType" @cancel="typeModal = false" />
  10. </van-popup>
  11. <van-field v-model="formData.name" name="供应商名称" label="供应商名称" placeholder="请填写供应商名称"
  12. :rules="[{ required: true, message: '供应商名称不能为空' }]" required />
  13. <van-field v-model="formData.cityName" is-link readonly label="所在城市" placeholder="选择所在城市"
  14. @click="cityModal = true" :rules="[{ required: true, message: '所在城市不能为空' }]" required />
  15. <van-popup v-model:show="cityModal" round position="bottom">
  16. <van-cascader v-model="formData.city" title="请选择所在地区" :options="areaInfo" @close="showArea = false"
  17. @change="cityOnChange" @finish="getAreaInfo" />
  18. </van-popup>
  19. <van-field v-model="formData.areaDetail" rows="3" type="textarea" name="详细地址" label="详细地址"
  20. placeholder="请填写详细地址" />
  21. <van-field v-model="formData.contactPerson" name="联系人" label="联系人" placeholder="请填写联系人"
  22. :rules="[{ required: true, message: '联系人不能为空' }]" required />
  23. <van-field v-model="formData.contactNumber" name="联系电话" label="联系电话" placeholder="请填写联系电话"
  24. :rules="[{ required: true, message: '联系电话不能为空' }]" required />
  25. <van-field name="uploader" label="文件上传">
  26. <template #input>
  27. <van-uploader v-model="fileList" :after-read="afterRead" multiple :max-count="9"
  28. :max-size="5 * 1024 * 1024" @oversize="onOversize" />
  29. </template>
  30. </van-field>
  31. </van-cell-group>
  32. <div style="margin: 16px">
  33. <van-button round block type="primary" native-type="submit"> 提交 </van-button>
  34. </div>
  35. </van-form>
  36. </div>
  37. </template>
  38. <script setup>
  39. import { ref, getCurrentInstance, onMounted } from "vue";
  40. import { showSuccessToast, showToast } from "vant";
  41. import { useRoute } from "vue-router";
  42. import { showLoadingToast, closeToast, showNotify } from 'vant';
  43. const proxy = getCurrentInstance().proxy;
  44. const route = useRoute();
  45. const show = ref(false);
  46. const typeModal = ref(false);
  47. const cityModal = ref(false);
  48. const areaInfo = ref([]);
  49. const classification = ref([
  50. {
  51. text: "贸易商",
  52. value: 1,
  53. },
  54. {
  55. text: "工厂",
  56. value: 2,
  57. }
  58. ]);
  59. const fieldNames = {
  60. text: "label",
  61. value: "id",
  62. };
  63. const typeList = ref([
  64. {
  65. text: "原料",
  66. value: "1",
  67. },
  68. {
  69. text: "辅料",
  70. value: "2",
  71. },
  72. {
  73. text: "配件",
  74. value: "3",
  75. },
  76. {
  77. text: "包材",
  78. value: "4",
  79. },
  80. {
  81. text: "其他",
  82. value: "5",
  83. },
  84. ]);
  85. const unitList = ref([
  86. {
  87. text: "个",
  88. value: "个",
  89. },
  90. {
  91. text: "双",
  92. value: "双",
  93. },
  94. ]);
  95. const formData = ref({
  96. id: null,
  97. definition: "2",
  98. productClassifyId: null,
  99. productClassifyName: null,
  100. code: null,
  101. customCode: null,
  102. type: null,
  103. typeName: null,
  104. name: null,
  105. spec: null,
  106. unit: null,
  107. remark: null,
  108. fileList: [],
  109. });
  110. const onConfirmType = ({ selectedOptions }) => {
  111. formData.value.type = selectedOptions[0].value;
  112. formData.value.typeName = selectedOptions[0].text;
  113. typeModal.value = false;
  114. };
  115. const cityOnChange = (selectedOptions) => {
  116. getAreaInfo(selectedOptions)
  117. };
  118. const onConfirmCity = (selectedOptions) => {
  119. console.log(selectedOptions)
  120. };
  121. const getAreaInfo = (selectedOptions) => {
  122. showLoadingToast('加载中...');
  123. proxy.post("/areaInfo/list", { parentId: selectedOptions.value }).then((res) => {
  124. let countryIndex = selectedOptions.selectedOptions[0].index;
  125. let provinceIndex = selectedOptions.tabIndex === 1 ? selectedOptions.selectedOptions[1].index : null;
  126. let cityIndex = selectedOptions.tabIndex === 2 ? selectedOptions.selectedOptions[2].index : null;
  127. //已经没有下级数据
  128. if (res.data.length === 0) {
  129. if (selectedOptions.tabIndex === 1) {
  130. formData.value.cityName = selectedOptions.selectedOptions.map((item) => item.text).join(' ');
  131. cityModal.value = false;
  132. formData.value.selectedOptions = selectedOptions;
  133. return;
  134. }
  135. }
  136. if (selectedOptions.tabIndex === 2) {
  137. formData.value.cityName = selectedOptions.selectedOptions.map((item) => item.text).join(' ');
  138. cityModal.value = false;
  139. formData.value.selectedOptions = selectedOptions;
  140. return;
  141. }
  142. if (selectedOptions.tabIndex === 0) {
  143. areaInfo.value[countryIndex].children = res.data.map((item, index) => {
  144. return {
  145. ...item,
  146. index: index,
  147. text: item.name,
  148. value: item.id,
  149. };
  150. });
  151. } else if (selectedOptions.tabIndex === 1) {
  152. areaInfo.value[countryIndex].children[provinceIndex].children = res.data.map((item, index) => {
  153. return {
  154. ...item,
  155. index: index,
  156. text: item.name,
  157. value: item.id,
  158. };
  159. });
  160. } else if (selectedOptions.tabIndex === 2) {
  161. areaInfo.value[countryIndex].children[provinceIndex].children[cityIndex].children = res.data.map((item, index) => {
  162. return {
  163. ...item,
  164. index: index,
  165. text: item.name,
  166. value: item.id,
  167. };
  168. });
  169. }
  170. console.log(areaInfo)
  171. closeToast();
  172. });
  173. };
  174. const fileList = ref([]);
  175. const afterRead = (file) => {
  176. if (file && file.length > 0) {
  177. for (let i = 0; i < file.length; i++) {
  178. file[i].status = "uploading";
  179. file[i].message = "上传中...";
  180. proxy.post("/fileInfo/getSing", { fileName: file[i].file.name }).then(
  181. (res) => {
  182. let forms = new FormData();
  183. forms.append("file", file[i].file);
  184. proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
  185. () => {
  186. file[i].id = res.data.id;
  187. file[i].url = res.data.fileUrl;
  188. file[i].fileName = res.data.fileName;
  189. delete file[i].status;
  190. delete file[i].message;
  191. },
  192. () => {
  193. file[i].status = "failed";
  194. file[i].message = "上传失败";
  195. }
  196. );
  197. },
  198. () => {
  199. file[i].status = "failed";
  200. file[i].message = "上传失败";
  201. }
  202. );
  203. }
  204. } else {
  205. file.status = "uploading";
  206. file.message = "上传中...";
  207. proxy.post("/fileInfo/getSing", { fileName: file.file.name }).then(
  208. (res) => {
  209. let forms = new FormData();
  210. forms.append("file", file.file);
  211. proxy.post("https://winfaster.obs.cn-south-1.myhuaweicloud.com", { ...res.data.uploadBody, file: forms.get("file") }).then(
  212. () => {
  213. file.id = res.data.id;
  214. file.url = res.data.fileUrl;
  215. file.fileName = res.data.fileName;
  216. delete file.status;
  217. delete file.message;
  218. },
  219. () => {
  220. file.status = "failed";
  221. file.message = "上传失败";
  222. }
  223. );
  224. },
  225. () => {
  226. file.status = "failed";
  227. file.message = "上传失败";
  228. }
  229. );
  230. }
  231. };
  232. const onOversize = () => {
  233. showToast("文件大小不能超过 5MB");
  234. };
  235. const onClickLeft = () => history.back();
  236. const onSubmit = () => {
  237. if (fileList.value && fileList.value.length > 0) {
  238. formData.value.fileList = fileList.value.map((item) => {
  239. return {
  240. id: item.id,
  241. fileName: item.fileName,
  242. };
  243. });
  244. } else {
  245. formData.value.fileList = [];
  246. }
  247. console.log(formData.value.selectedOptions)
  248. if(formData.value.selectedOptions) {
  249. formData.value.countryId = formData.value.selectedOptions.selectedOptions[0].value;
  250. formData.value.provinceId = formData.value.selectedOptions.tabIndex === 2 ? formData.value.selectedOptions.selectedOptions[1].value : null
  251. formData.value.cityId = formData.value.selectedOptions.tabIndex === 1 ?
  252. formData.value.selectedOptions.selectedOptions[1].value :
  253. formData.value.selectedOptions.selectedOptions[2].value;
  254. }
  255. proxy.post("/supplierInfo/" + route.query.type, formData.value).then(() => {
  256. showSuccessToast(route.query.type == 'add' ? '添加成功' : '修改成功');
  257. setTimeout(() => {
  258. history.back();
  259. }, 500);
  260. });
  261. };
  262. onMounted(() => {
  263. proxy.post("/areaInfo/list", formData.value).then((res) => {
  264. areaInfo.value = res.data.map((item, index) => {
  265. return {
  266. ...item,
  267. index: index,
  268. text: item.chineseName,
  269. value: item.id,
  270. children: []
  271. };
  272. });
  273. });
  274. if(route.query.type == 'add') return
  275. proxy.post("/supplierInfo/detail", { id: route.query.id }).then((res) => {
  276. formData.value = res.data
  277. formData.value.typeName = res.data.type == 1 ? '供应商' : '客户'
  278. })
  279. });
  280. </script>