AddPage.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <script lang="ts" setup>
  2. /**
  3. * @Name: AddPage.vue
  4. * @Description: 商品添加页
  5. * @Author: Cheney
  6. */
  7. import { FormInstance, FormRules } from 'element-plus';
  8. import { CirclePlusFilled, Finished, RefreshLeft, Select } from '@element-plus/icons-vue';
  9. import SelectDrawer from './SelectDrawer.vue';
  10. import { useResponse } from '/@/utils/useResponse';
  11. import * as api from '../api';
  12. const route = useRoute();
  13. const routeQuery: any = ref(route.query);
  14. console.log("=>(AddPage.vue:16) routeQuery", routeQuery.value.type);
  15. const currencyCodeOptions = ref([]);
  16. const countryOptions = ref([]);
  17. const loading = ref(false);
  18. const isShow = ref(false);
  19. interface RuleForm {
  20. country_code: any;
  21. platform: any;
  22. sku: any;
  23. weight: any;
  24. currency_code: any;
  25. price_amz_min: any;
  26. estimated_cost: any;
  27. final_cost: any;
  28. price_market: any;
  29. sales_mode: any;
  30. cost: any;
  31. price_show: any;
  32. price_daily: any;
  33. price_min: any;
  34. }
  35. const ruleFormRef = ref<FormInstance>();
  36. const ruleForm = reactive<RuleForm>({
  37. country_code: '',
  38. platform: '',
  39. sku: '',
  40. weight: '',
  41. currency_code: '',
  42. price_amz_min: '',
  43. estimated_cost: '',
  44. final_cost: '',
  45. price_market: '',
  46. sales_mode: '',
  47. cost: '',
  48. price_show: '',
  49. price_daily: '',
  50. price_min: '',
  51. });
  52. const rules = reactive<FormRules<RuleForm>>({
  53. sku: [{ required: true, message: '请输入SKU', trigger: 'blur' }],
  54. platform: [{ required: true, message: '请输入平台', trigger: 'blur' }],
  55. country_code: [{ required: true, message: '请输入国家', trigger: 'blur' }],
  56. currency_code: [{ required: true, message: '请选择货币代码', trigger: 'change' }],
  57. sales_mode: [{ required: true, message: '请输入销售模式', trigger: 'blur' }],
  58. estimated_cost: [{ required: true, message: '请输入预估成本', trigger: 'blur' }],
  59. });
  60. const submitForm = async (formEl: FormInstance | undefined) => {
  61. if (!formEl) return;
  62. await formEl.validate(async (valid, fields) => {
  63. if (valid) {
  64. const res = await useResponse(routeQuery.value.type === 'supply' ? api.postSupplyCreate : api.postDirectCreate, ruleForm, loading);
  65. if (res.code === 2000) {
  66. ElMessage.success({ message: res.msg, plain: true, icon: CirclePlusFilled });
  67. resetForm(formEl);
  68. }
  69. } else {
  70. console.log('error submit!', fields);
  71. }
  72. });
  73. };
  74. const resetForm = (formEl: FormInstance | undefined) => {
  75. if (!formEl) return;
  76. formEl.resetFields();
  77. };
  78. onBeforeMount(() => {
  79. fetchCurrencyCodeOptions();
  80. fetchCountryOptions();
  81. });
  82. async function fetchCurrencyCodeOptions() {
  83. const res = await useResponse(api.getCurrencyCodeOptions);
  84. currencyCodeOptions.value = res.data.currency_code;
  85. }
  86. async function fetchCountryOptions() {
  87. const res = await useResponse(api.getCountryOptions);
  88. countryOptions.value = res.data.country_code;
  89. }
  90. function showSelectDrawer() {
  91. isShow.value = true;
  92. }
  93. function getCheckId(id: any) {
  94. ruleForm.cost = id.value;
  95. }
  96. </script>
  97. <template>
  98. <div class="p-5">
  99. <el-card class="h-full" style="color: rgba(0, 0, 0, 0.88)">
  100. <template #header>
  101. <span class="text-lg"> 审批查看({{ routeQuery.type === 'supply' ? '供货' : '直销' }}) - 创建 </span>
  102. </template>
  103. <div class="w-full">
  104. <!-- 供货 -->
  105. <el-form
  106. v-if="routeQuery.type === 'supply'"
  107. ref="ruleFormRef"
  108. :model="ruleForm"
  109. :rules="rules"
  110. class="mx-2.5"
  111. label-position="top"
  112. label-width="auto"
  113. status-icon
  114. >
  115. <el-row :gutter="20">
  116. <el-col :span="6">
  117. <el-form-item class="font-medium" label="国 家" prop="country_code">
  118. <el-select v-model="ruleForm.country_code" placeholder="请选择国家">
  119. <el-option v-for="item in countryOptions" :label="item" :value="item"></el-option>
  120. </el-select>
  121. <!--<el-input v-model="ruleForm.country_code" placeholder="请输入国家" />-->
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="6">
  125. <el-form-item class="font-medium" label="平 台" prop="platform">
  126. <el-input v-model="ruleForm.platform" placeholder="请输入平台" />
  127. </el-form-item>
  128. </el-col>
  129. <el-col :span="6">
  130. <el-form-item class="font-medium" label="SKU" prop="sku">
  131. <el-input v-model="ruleForm.sku" placeholder="请输入SKU" />
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="6">
  135. <el-form-item class="font-medium" label="重 量(KG)" prop="weight">
  136. <el-input v-model="ruleForm.weight" placeholder="请输入重量" />
  137. </el-form-item>
  138. </el-col>
  139. </el-row>
  140. <el-row :gutter="20">
  141. <el-col :span="6">
  142. <el-form-item class="font-medium" label="货币代码" prop="currency_code">
  143. <el-select v-model="ruleForm.currency_code" placeholder="请选择货币代码">
  144. <el-option v-for="item in currencyCodeOptions" :label="item" :value="item" />
  145. </el-select>
  146. </el-form-item>
  147. </el-col>
  148. <el-col :span="6">
  149. <el-form-item class="font-medium" label="预估硬件成本" prop="estimated_cost">
  150. <el-input v-model="ruleForm.estimated_cost" placeholder="请输入预估硬件成本" />
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="6">
  154. <el-form-item class="font-medium" label="最低售价(外币)" prop="price_amz_min">
  155. <el-input v-model="ruleForm.price_amz_min" placeholder="请输入最低售价(外币)" />
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="6">
  159. <el-form-item class="font-medium" label="尾程费用(外币)" prop="final_cost">
  160. <el-input v-model="ruleForm.final_cost" placeholder="请输入尾程费用(外币)" />
  161. </el-form-item>
  162. </el-col>
  163. </el-row>
  164. <el-row :gutter="20" style="margin-bottom: 5px">
  165. <el-col :span="6">
  166. <el-form-item class="font-medium" label="销售模式" prop="sales_mode">
  167. <!--<el-input v-model="ruleForm.sales_mode" placeholder="请输入销售模式" />-->
  168. <el-select v-model="ruleForm.sales_mode" clearable placeholder="请选择销售模式">
  169. <el-option label="线上" value="线上"></el-option>
  170. <el-option label="线下" value="线下"></el-option>
  171. </el-select>
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="6">
  175. <el-form-item class="font-medium" label="成 本" prop="cost">
  176. <el-button v-if="!ruleForm.cost" :icon="Select" class="w-full" plain type="primary" @click="showSelectDrawer"> 选 择 </el-button>
  177. <div v-else class="flex flex-1">
  178. <el-input v-model="ruleForm.cost" :disabled="true">
  179. <template #prepend>
  180. <i class="bi bi-cash-coin" style="color: #67c23a; font-size: 20px"></i>
  181. </template>
  182. <template #append>
  183. <el-button style="color: #e6a23c" @click="showSelectDrawer"> 重新选择 </el-button>
  184. </template>
  185. </el-input>
  186. </div>
  187. </el-form-item>
  188. </el-col>
  189. </el-row>
  190. </el-form>
  191. <!-- 直销 -->
  192. <el-form v-else ref="ruleFormRef" :model="ruleForm" :rules="rules" class="mx-2.5" label-position="top" label-width="auto" status-icon>
  193. <el-row :gutter="20">
  194. <el-col :span="6">
  195. <el-form-item class="font-medium" label="国 家" prop="country_code">
  196. <el-select v-model="ruleForm.country_code" placeholder="请选择国家">
  197. <el-option v-for="item in countryOptions" :label="item" :value="item"></el-option>
  198. </el-select>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="6">
  202. <el-form-item class="font-medium" label="平 台" prop="platform">
  203. <el-input v-model="ruleForm.platform" placeholder="请输入平台" />
  204. </el-form-item>
  205. </el-col>
  206. <el-col :span="6">
  207. <el-form-item class="font-medium" label="SKU" prop="sku">
  208. <el-input v-model="ruleForm.sku" placeholder="请输入SKU" />
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="6">
  212. <el-form-item class="font-medium" label="重 量(KG)" prop="weight">
  213. <el-input v-model="ruleForm.weight" placeholder="请输入重量" />
  214. </el-form-item>
  215. </el-col>
  216. </el-row>
  217. <el-row :gutter="20">
  218. <el-col :span="6">
  219. <el-form-item class="font-medium" label="货币代码" prop="currency_code">
  220. <el-select v-model="ruleForm.currency_code" placeholder="请选择货币代码">
  221. <el-option v-for="item in currencyCodeOptions" :label="item" :value="item" />
  222. </el-select>
  223. </el-form-item>
  224. </el-col>
  225. <el-col :span="6">
  226. <el-form-item class="font-medium" label="展示价格(外币)" prop="price_show">
  227. <el-input v-model="ruleForm.price_show" placeholder="请输入展示价格(外币)" />
  228. </el-form-item>
  229. </el-col>
  230. <el-col :span="6">
  231. <el-form-item class="font-medium" label="日常活动售价(外币)" prop="price_daily">
  232. <el-input v-model="ruleForm.price_daily" placeholder="请输入日常活动售价(外币)" />
  233. </el-form-item>
  234. </el-col>
  235. <el-col :span="6">
  236. <el-form-item class="font-medium" label="最低售价(外币)" prop="price_min">
  237. <el-input v-model="ruleForm.price_min" placeholder="请输入最低售价(外币)" />
  238. </el-form-item>
  239. </el-col>
  240. </el-row>
  241. <el-row :gutter="20" style="margin-bottom: 5px">
  242. <el-col :span="6">
  243. <el-form-item class="font-medium" label="预估硬件成本" prop="estimated_cost">
  244. <el-input v-model="ruleForm.estimated_cost" placeholder="请输入预估成本" />
  245. </el-form-item>
  246. </el-col>
  247. <el-col :span="6">
  248. <el-form-item class="font-medium" label="尾程费用(外币)" prop="final_cost">
  249. <el-input v-model="ruleForm.final_cost" placeholder="请输入尾程费用(外币)" />
  250. </el-form-item>
  251. </el-col>
  252. <el-col :span="6">
  253. <el-form-item class="font-medium" label="销售模式" prop="sales_mode">
  254. <!--<el-input v-model="ruleForm.sales_mode" placeholder="请输入销售模式" />-->
  255. <el-select v-model="ruleForm.sales_mode" clearable placeholder="请选择销售模式">
  256. <el-option label="线上" value="线上"></el-option>
  257. <el-option label="线下" value="线下"></el-option>
  258. </el-select>
  259. </el-form-item>
  260. </el-col>
  261. <el-col :span="6">
  262. <el-form-item class="font-medium" label="成 本" prop="cost">
  263. <el-button v-if="!ruleForm.cost" :icon="Select" class="w-full" plain type="primary" @click="showSelectDrawer"> 选 择 </el-button>
  264. <div v-else class="flex flex-1">
  265. <el-input v-model="ruleForm.cost" :disabled="true">
  266. <template #prepend>
  267. <i class="bi bi-cash-coin" style="color: #67c23a"></i>
  268. </template>
  269. <template #append>
  270. <el-button style="color: #e6a23c" @click="showSelectDrawer"> 重新选择 </el-button>
  271. </template>
  272. </el-input>
  273. </div>
  274. </el-form-item>
  275. </el-col>
  276. </el-row>
  277. </el-form>
  278. </div>
  279. <template #footer>
  280. <div class="flex justify-end">
  281. <el-button :icon="RefreshLeft" @click="resetForm(ruleFormRef)">重 置</el-button>
  282. <el-button :icon="Finished" :loading="loading" type="primary" @click="submitForm(ruleFormRef)">确 定 </el-button>
  283. </div>
  284. </template>
  285. </el-card>
  286. <SelectDrawer v-if="isShow" v-model="isShow" :title="routeQuery.type === 'supply' ? '供货' : '直销'" @sendCheckId="getCheckId" />
  287. </div>
  288. </template>
  289. <style scoped></style>