index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <template>
  2. <view class="commission-form-page">
  3. <u-navbar
  4. placeholder
  5. :autoBack="true"
  6. :title="pageTitle"
  7. @rightClick="submitForm"
  8. >
  9. <view class="u-nav-slot" slot="right"> 保存 </view>
  10. </u-navbar>
  11. <!-- 表单内容 -->
  12. <view class="follow_form_wrap">
  13. <u--form
  14. labelPosition="left"
  15. labelWidth="130"
  16. :model="commissionForm"
  17. :rules="rules"
  18. ref="commissionFormRef"
  19. class="form_wrap"
  20. :errorType="'toast'"
  21. >
  22. <u-form-item label="账户类型" prop="accountType" borderBottom :required="true">
  23. <ld-select
  24. :list="accountTypeOptions"
  25. label-key="label"
  26. value-key="value"
  27. placeholder="请选择账户类型"
  28. v-model="commissionForm.accountType"
  29. :border="false"
  30. ></ld-select>
  31. <u-icon slot="right" name="arrow-right"></u-icon>
  32. </u-form-item>
  33. <u-form-item label="分成人" prop="userName" borderBottom :required="true" @click="handleShowCommissionUser">
  34. <u--input
  35. v-model="commissionForm.userName"
  36. disabled style='pointer-events: none !important'
  37. disabledColor="#ffffff"
  38. placeholder="点击选择"
  39. border="none"
  40. ></u--input>
  41. <u-icon slot="right" name="arrow-right"></u-icon>
  42. </u-form-item>
  43. <u-form-item label="分成比例(%)" prop="commissionRate" borderBottom :required="true">
  44. <u--input
  45. v-model.number="commissionForm.commissionRate"
  46. type="number"
  47. placeholder="请输入分成比例(0-100)"
  48. border="none"
  49. @blur="validateCommissionRate"
  50. ></u--input>
  51. </u-form-item>
  52. <u-form-item label="是否归属公司业绩" prop="isCompanyPerformance" borderBottom :required="true">
  53. <ld-select
  54. :list="companyPerformanceOptions"
  55. label-key="label"
  56. value-key="value"
  57. placeholder="请选择是否归属公司业绩"
  58. v-model="commissionForm.isCompanyPerformance"
  59. :border="false"
  60. ></ld-select>
  61. <u-icon slot="right" name="arrow-right"></u-icon>
  62. </u-form-item>
  63. <u-form-item label="关联收单信息" prop="receiptFormId" borderBottom :required="true">
  64. <ld-select
  65. :list="receiptList"
  66. label-key="item"
  67. value-key="id"
  68. placeholder="请选择收单信息"
  69. v-model="commissionForm.receiptFormId"
  70. :border="false"
  71. ></ld-select>
  72. <u-icon slot="right" name="arrow-right"></u-icon>
  73. </u-form-item>
  74. </u--form>
  75. </view>
  76. <!-- 分成人选择器 -->
  77. <ba-tree-picker :selectParent="false" v-if="commissionUserList.length > 0" ref="commissionUser" :multiple='false'
  78. @select-change="commissionUserSelectChange" border title="分成人" :localdata="commissionUserList" valueKey="id" textKey="label"
  79. childrenKey="children" :selectedValues="commissionForm.userId" :personNames="commissionForm.userName" />
  80. </view>
  81. </template>
  82. <script>
  83. import ldSelect from "@/components/ld-select/ld-select.vue";
  84. import { filterCustomerManager, handleTree } from '@/utils/util';
  85. export default {
  86. name: "CommissionForm",
  87. components: {
  88. ldSelect
  89. },
  90. data() {
  91. return {
  92. loading: false,
  93. commissionForm: {
  94. id: undefined,
  95. sendFormId: '',
  96. clueId: '',
  97. receiptFormId: '',
  98. accountType: '1',
  99. userName: '',
  100. userId: '',
  101. commissionRate: undefined,
  102. isCompanyPerformance: '1'
  103. },
  104. receiptList: [],
  105. commissionUserList: [],
  106. accountTypeOptions: [
  107. { label: "前端", value: "1" },
  108. { label: "后端", value: "2" }
  109. ],
  110. companyPerformanceOptions: [
  111. { label: "是", value: "1" },
  112. { label: "否", value: "2" }
  113. ],
  114. // 表单验证规则
  115. rules: {
  116. accountType: [{ required: true, message: "请选择账户类型", trigger: "change" }],
  117. userName: [{ required: true, message: "请选择分成人", trigger: "blur" }],
  118. commissionRate: [
  119. {
  120. validator: (rule, value, callback) => {
  121. if (value === undefined || value === null || value === '') {
  122. callback(new Error("请输入分成比例"));
  123. } else {
  124. callback();
  125. }
  126. },
  127. trigger: "blur"
  128. },
  129. { type: 'number', min: 0, max: 100, message: '分成比例必须在0-100之间', trigger: "blur" }
  130. ],
  131. isCompanyPerformance: [{ required: true, message: "请选择是否归属公司业绩", trigger: "change" }],
  132. receiptFormId: [{ required: true, message: "请选择关联收单信息", trigger: "change" }]
  133. },
  134. };
  135. },
  136. computed: {
  137. pageTitle() {
  138. return this.commissionForm.id ? "编辑分成" : "新增分成";
  139. },
  140. },
  141. onLoad(options) {
  142. // 从路由参数获取sendFormId和clueId
  143. this.commissionForm.sendFormId = options.sendFormId;
  144. this.commissionForm.clueId = options.clueId;
  145. this.commissionForm.id = options.id;
  146. // 获取分成人列表
  147. this.getCommissionUserList();
  148. this.fetchReceiptList().then(() => {
  149. if (options.id) {
  150. this.initForm(options.id);
  151. }
  152. });
  153. },
  154. methods: {
  155. // 获取分成人列表
  156. getCommissionUserList() {
  157. // 获取人员列表
  158. uni.$u.api.getCustomerManagerAllList().then(res => {
  159. this.commissionUserList = filterCustomerManager(res.data);
  160. });
  161. },
  162. // 显示分成人选择器
  163. handleShowCommissionUser() {
  164. this.$refs.commissionUser._show();
  165. },
  166. // 分成人选择变化
  167. commissionUserSelectChange(ids, names) {
  168. this.commissionForm.userId = ids[0];
  169. this.commissionForm.userName = names[0];
  170. },
  171. // 获取收单列表
  172. async fetchReceiptList() {
  173. try {
  174. const res = await uni.$u.api.clueReceiptFormListByOrderId(this.commissionForm.sendFormId);
  175. this.receiptList = res.data || [];
  176. } catch (error) {
  177. console.error("获取收单列表失败:", error);
  178. uni.$u.toast("获取收单列表失败");
  179. }
  180. },
  181. // 初始化表单数据
  182. async initForm(id) {
  183. try {
  184. const res = await uni.$u.api.clueCommissionById(id);
  185. this.commissionForm = res.data;
  186. } catch (error) {
  187. console.error("获取分成详情失败:", error);
  188. uni.$u.toast("获取分成详情失败");
  189. }
  190. },
  191. // 分成比例验证
  192. validateCommissionRate() {
  193. const { commissionRate } = this.commissionForm;
  194. if (!commissionRate && commissionRate !== 0) return;
  195. const rate = Number(commissionRate);
  196. if (rate < 0) {
  197. uni.$u.toast("分成比例不能小于0");
  198. this.commissionForm.commissionRate = 0;
  199. } else if (rate > 100) {
  200. uni.$u.toast("分成比例不能大于100");
  201. this.commissionForm.commissionRate = 100;
  202. }
  203. },
  204. // 提交表单
  205. submitForm() {
  206. this.$refs.commissionFormRef.validate().then(async (valid) => {
  207. if (valid) {
  208. await this.handleUpdate();
  209. } else {
  210. uni.$u.toast("请检查表单填写是否正确");
  211. }
  212. });
  213. },
  214. // 更新表单
  215. async handleUpdate() {
  216. try {
  217. this.loading = true;
  218. // 根据是否有id判断是新增还是修改
  219. if (this.commissionForm.id) {
  220. // 修改
  221. await uni.$u.api.clueCommissionUpdate(this.commissionForm);
  222. uni.$emit('addCommissionSuccess');
  223. uni.$u.toast("修改成功");
  224. } else {
  225. // 新增
  226. await uni.$u.api.clueCommissionAdd(this.commissionForm);
  227. uni.$emit('addCommissionSuccess');
  228. uni.$u.toast("新增成功");
  229. }
  230. // 延迟返回上一页
  231. setTimeout(() => {
  232. uni.navigateBack();
  233. }, 1500);
  234. } catch (error) {
  235. uni.$u.toast(error);
  236. } finally {
  237. this.loading = false;
  238. }
  239. },
  240. },
  241. };
  242. </script>
  243. <style lang="scss">
  244. .commission-form-page {
  245. background-color: #fff;
  246. }
  247. @import "@/static/follow/index.scss";
  248. </style>