procurementProfile.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <template>
  2. <div class="p-2">
  3. <el-card shadow="never">
  4. <template #header>
  5. <el-row :gutter="10" class="mb8">
  6. <el-col :span="22">
  7. <span>企业采购习惯</span>
  8. </el-col>
  9. </el-row>
  10. </template>
  11. <el-form ref="purchaseHabitFormRef" :model="form" :rules="rules" label-width="140px">
  12. <!-- 基本信息 -->
  13. <el-row :gutter="20">
  14. <el-col :span="12">
  15. <el-form-item label="月度采购金额预估" prop="monthPurchase">
  16. <el-input v-model="form.monthPurchase" placeholder="请输入月度采购金额预估" />
  17. </el-form-item>
  18. </el-col>
  19. </el-row>
  20. <el-row :gutter="20">
  21. <el-col :span="12">
  22. <el-form-item label="年度采购金额" prop="yearPurchase">
  23. <el-input v-model="form.yearPurchase" placeholder="请输入年度采购金额" />
  24. </el-form-item>
  25. </el-col>
  26. </el-row>
  27. <!-- 产品选择 -->
  28. <el-row :gutter="20">
  29. <el-col :span="24">
  30. <el-form-item label="产品选型" prop="choiceModel">
  31. <el-radio-group v-model="form.choiceModel">
  32. <el-radio v-for="dict in product_types_choosing" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  33. </el-radio-group>
  34. </el-form-item>
  35. </el-col>
  36. </el-row>
  37. <!-- 日常打印量 -->
  38. <el-row :gutter="20">
  39. <el-col :span="24">
  40. <el-form-item label="日常打印量" prop="printAmount">
  41. <el-radio-group v-model="form.printAmount">
  42. <el-radio v-for="dict in daily_print_volume" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  43. </el-radio-group>
  44. </el-form-item>
  45. </el-col>
  46. </el-row>
  47. <!-- 购买选项 -->
  48. <el-row :gutter="20">
  49. <el-col :span="12">
  50. <el-form-item label="购买原装耗材" prop="buyOriginal">
  51. <el-radio-group v-model="form.buyOriginal">
  52. <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  53. </el-radio-group>
  54. </el-form-item>
  55. </el-col>
  56. </el-row>
  57. <el-row :gutter="20">
  58. <el-col :span="12">
  59. <el-form-item label="专人进行技术服务" prop="technologyService">
  60. <el-radio-group v-model="form.technologyService">
  61. <el-radio v-for="dict in sys_platform_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
  62. </el-radio-group>
  63. </el-form-item>
  64. </el-col>
  65. </el-row>
  66. <!-- 主要办公采购类目 -->
  67. <el-row :gutter="20">
  68. <el-col :span="24">
  69. <el-form-item label="主要办公采购类目" prop="purchaseCategory">
  70. <el-checkbox-group v-model="purchaseCategoryArr">
  71. <el-checkbox v-for="dict in purchase_item" :key="dict.value" :value="dict.value">
  72. {{ dict.label }}
  73. </el-checkbox>
  74. </el-checkbox-group>
  75. </el-form-item>
  76. </el-col>
  77. </el-row>
  78. <el-row :gutter="20">
  79. <el-col :span="24">
  80. <el-form-item prop="otherCategory">
  81. <el-input v-model="form.otherCategory" type="textarea" :rows="2" placeholder="其他采购品类" />
  82. </el-form-item>
  83. </el-col>
  84. </el-row>
  85. <!-- 企业福利 -->
  86. <el-row :gutter="20">
  87. <el-col :span="24">
  88. <el-form-item label="企业福利" prop="adaptScene">
  89. <el-checkbox-group v-model="adaptSceneArr">
  90. <el-checkbox v-for="dict in welfare_item" :key="dict.value" :value="dict.value">
  91. {{ dict.label }}
  92. </el-checkbox>
  93. </el-checkbox-group>
  94. </el-form-item>
  95. </el-col>
  96. </el-row>
  97. <el-row :gutter="20">
  98. <el-col :span="24">
  99. <el-form-item prop="otherScene">
  100. <el-input v-model="form.otherScene" type="textarea" :rows="2" placeholder="其他企业福利" />
  101. </el-form-item>
  102. </el-col>
  103. </el-row>
  104. <!-- 产品定制需求 -->
  105. <el-row :gutter="20">
  106. <el-col :span="24">
  107. <el-form-item label="产品定制需求" prop="customizeDemand">
  108. <el-checkbox-group v-model="customizeDemandArr">
  109. <el-checkbox v-for="dict in product_customization" :key="dict.value" :value="dict.value">
  110. {{ dict.label }}
  111. </el-checkbox>
  112. </el-checkbox-group>
  113. </el-form-item>
  114. </el-col>
  115. </el-row>
  116. <el-row :gutter="20">
  117. <el-col :span="24">
  118. <el-form-item prop="otherCustomize">
  119. <el-input v-model="form.otherCustomize" type="textarea" :rows="2" placeholder="其他定制化需求" />
  120. </el-form-item>
  121. </el-col>
  122. </el-row>
  123. <!-- 提交按钮 -->
  124. <el-row :gutter="20">
  125. <el-col :span="24" class="text-center">
  126. <el-button @click="goBack">取消</el-button>
  127. <el-button :loading="buttonLoading" type="primary" @click="submitForm">保存</el-button>
  128. </el-col>
  129. </el-row>
  130. </el-form>
  131. </el-card>
  132. </div>
  133. </template>
  134. <script setup name="PurchaseHabit" lang="ts">
  135. import {
  136. listPurchaseHabit,
  137. getPurchaseHabit,
  138. delPurchaseHabit,
  139. addPurchaseHabit,
  140. updatePurchaseHabit,
  141. getCustomerPurchaseHabitData
  142. } from '@/api/customer/customerFile/purchaseHabit';
  143. import { PurchaseHabitVO, PurchaseHabitQuery, PurchaseHabitForm } from '@/api/customer/customerFile/purchaseHabit/types';
  144. // 接收父组件传递的props
  145. const props = defineProps<{
  146. customerId?: string;
  147. customerNo?: string;
  148. customerName?: string;
  149. }>();
  150. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  151. const { welfare_item, sys_platform_yes_no, product_types_choosing, purchase_item, product_customization, daily_print_volume } = toRefs<any>(
  152. proxy?.useDict('welfare_item', 'sys_platform_yes_no', 'product_types_choosing', 'purchase_item', 'product_customization', 'daily_print_volume')
  153. );
  154. const purchaseHabitList = ref<PurchaseHabitVO[]>([]);
  155. const buttonLoading = ref(false);
  156. const loading = ref(true);
  157. const router = useRouter();
  158. const ids = ref<Array<string | number>>([]);
  159. const single = ref(true);
  160. const multiple = ref(true);
  161. const total = ref(0);
  162. const adaptSceneArr = ref<Array<string | number>>([]);
  163. const purchaseCategoryArr = ref<Array<string | number>>([]);
  164. const customizeDemandArr = ref<Array<string | number>>([]);
  165. const queryFormRef = ref<ElFormInstance>();
  166. const purchaseHabitFormRef = ref<ElFormInstance>();
  167. const dialog = reactive<DialogOption>({
  168. visible: false,
  169. title: ''
  170. });
  171. const initFormData: PurchaseHabitForm = {
  172. id: undefined,
  173. customerId: undefined,
  174. customerNo: undefined,
  175. monthPurchase: undefined,
  176. yearPurchase: undefined,
  177. permanentOfficer: undefined,
  178. choiceModel: undefined,
  179. printAmount: undefined,
  180. buyOriginal: '1',
  181. technologyService: '1',
  182. purchaseCategory: undefined,
  183. otherCategory: undefined,
  184. adaptScene: undefined,
  185. otherScene: undefined,
  186. customizeDemand: undefined,
  187. otherCustomize: undefined,
  188. remark: undefined
  189. };
  190. const data = reactive<PageData<PurchaseHabitForm, PurchaseHabitQuery>>({
  191. form: { ...initFormData },
  192. queryParams: {
  193. pageNum: 1,
  194. pageSize: 10,
  195. customerId: undefined,
  196. customerNo: undefined,
  197. monthPurchase: undefined,
  198. yearPurchase: undefined,
  199. permanentOfficer: undefined,
  200. choiceModel: undefined,
  201. printAmount: undefined,
  202. buyOriginal: undefined,
  203. technologyService: undefined,
  204. purchaseCategory: undefined,
  205. otherCategory: undefined,
  206. adaptScene: undefined,
  207. otherScene: undefined,
  208. customizeDemand: undefined,
  209. otherCustomize: undefined,
  210. platformCode: undefined,
  211. params: {}
  212. },
  213. rules: {
  214. buyOriginal: [{ required: true, message: '是否购买原装耗材不能为空', trigger: 'change' }],
  215. technologyService: [{ required: true, message: '是否购买技术服务不能为空', trigger: 'change' }]
  216. }
  217. });
  218. const { queryParams, form, rules } = toRefs(data);
  219. /** 查询客户采购习惯列表 */
  220. const getList = async () => {
  221. loading.value = true;
  222. const res = await listPurchaseHabit(queryParams.value);
  223. purchaseHabitList.value = res.rows;
  224. total.value = res.total;
  225. loading.value = false;
  226. };
  227. /** 加载客户采购画像数据 */
  228. const loadCustomerPurchaseData = async () => {
  229. if (!props.customerId) return;
  230. try {
  231. loading.value = true;
  232. const res = await getCustomerPurchaseHabitData(props.customerId);
  233. if (res.data) {
  234. Object.assign(form.value, res.data);
  235. // 将字符串转换为数组并赋值给对应的数组变量
  236. if (form.value.purchaseCategory && typeof form.value.purchaseCategory === 'string') {
  237. purchaseCategoryArr.value = form.value.purchaseCategory.split(',').filter((item: string) => item.trim());
  238. } else {
  239. purchaseCategoryArr.value = [];
  240. }
  241. if (form.value.adaptScene && typeof form.value.adaptScene === 'string') {
  242. adaptSceneArr.value = form.value.adaptScene.split(',').filter((item: string) => item.trim());
  243. } else {
  244. adaptSceneArr.value = [];
  245. }
  246. if (form.value.customizeDemand && typeof form.value.customizeDemand === 'string') {
  247. customizeDemandArr.value = form.value.customizeDemand.split(',').filter((item: string) => item.trim());
  248. } else {
  249. customizeDemandArr.value = [];
  250. }
  251. } else {
  252. // 如果没有数据,设置客户编号并初始化数组
  253. form.value.customerId = props.customerId;
  254. form.value.customerNo = props.customerNo;
  255. purchaseCategoryArr.value = [];
  256. adaptSceneArr.value = [];
  257. customizeDemandArr.value = [];
  258. }
  259. } catch (error) {
  260. console.error('加载采购画像数据失败:', error);
  261. // 如果加载失败,设置客户编号并初始化数组
  262. form.value.customerId = props.customerId;
  263. form.value.customerNo = props.customerNo;
  264. purchaseCategoryArr.value = [];
  265. adaptSceneArr.value = [];
  266. customizeDemandArr.value = [];
  267. } finally {
  268. loading.value = false;
  269. }
  270. };
  271. const goBack = () => {
  272. router.push('/customer/customer-file/customer-list');
  273. };
  274. /** 提交按钮 */
  275. const submitForm = () => {
  276. purchaseHabitFormRef.value?.validate(async (valid: boolean) => {
  277. if (valid) {
  278. buttonLoading.value = true;
  279. // 将数组变量转换为逗号分隔的字符串并赋值给form字段
  280. form.value.purchaseCategory = purchaseCategoryArr.value.join(',');
  281. form.value.adaptScene = adaptSceneArr.value.join(',');
  282. form.value.customizeDemand = customizeDemandArr.value.join(',');
  283. try {
  284. if (form.value.id) {
  285. await updatePurchaseHabit(form.value);
  286. } else {
  287. await addPurchaseHabit(form.value);
  288. }
  289. proxy?.$modal.msgSuccess('保存成功');
  290. // 重新加载数据
  291. await loadCustomerPurchaseData();
  292. } catch (error) {
  293. console.error('保存失败:', error);
  294. proxy?.$modal.msgError('保存失败,请重试');
  295. } finally {
  296. buttonLoading.value = false;
  297. }
  298. }
  299. });
  300. };
  301. /** 删除按钮操作 */
  302. const handleDelete = async (row?: PurchaseHabitVO) => {
  303. const _ids = row?.id || ids.value;
  304. await proxy?.$modal.confirm('是否确认删除客户采购习惯编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
  305. await delPurchaseHabit(_ids);
  306. proxy?.$modal.msgSuccess('删除成功');
  307. await getList();
  308. };
  309. /** 导出按钮操作 */
  310. const handleExport = () => {
  311. proxy?.download(
  312. 'customer/purchaseHabit/export',
  313. {
  314. ...queryParams.value
  315. },
  316. `purchaseHabit_${new Date().getTime()}.xlsx`
  317. );
  318. };
  319. onMounted(() => {
  320. // 页面加载时根据客户编号查询采购画像数据
  321. loadCustomerPurchaseData();
  322. });
  323. // 监听props变化
  324. watch(
  325. () => props.customerId,
  326. (newCustomerId) => {
  327. if (newCustomerId) {
  328. loadCustomerPurchaseData();
  329. }
  330. }
  331. );
  332. </script>