AddCompanyDialog.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <template>
  2. <!-- 添加或修改菜单对话框 -->
  3. <el-dialog
  4. title="客户添加"
  5. v-model="visible"
  6. width="680px"
  7. append-to-body
  8. draggable
  9. :close-on-click-modal = "false"
  10. >
  11. <el-form
  12. ref="companyRef"
  13. :model="form"
  14. size="small"
  15. :rules="rules"
  16. label-width="100px"
  17. >
  18. <el-row>
  19. <el-col :span="24">
  20. <el-radio-group v-model="addType">
  21. <el-radio-button :label="1">表单添加</el-radio-button>
  22. <el-radio-button :label="2">导入添加</el-radio-button>
  23. </el-radio-group>
  24. </el-col>
  25. <el-col v-if="addType === 1" :span="24">
  26. <el-form-item label="客户名称" prop="name">
  27. <el-input v-model="form.name" placeholder="请输入客户名称" />
  28. </el-form-item>
  29. </el-col>
  30. <el-col v-if="addType === 1" :span="24">
  31. <el-form-item label="客户来源" prop="sourceCategoryName" required>
  32. <CustomerFormCom
  33. ref="addComRef"
  34. :edit-status="true"
  35. :form-data="form"
  36. :source-categories="sourceCategories"
  37. />
  38. </el-form-item>
  39. </el-col>
  40. <el-col v-if="addType === 2" :span="24">
  41. <el-form-item label="上传">
  42. <el-upload
  43. ref="uploadRef"
  44. :limit="1"
  45. accept=".xlsx, .xls"
  46. :headers="upload.headers"
  47. :action="upload.url + '?updateSupport=' + upload.updateSupport"
  48. :disabled="upload.isUploading"
  49. :on-progress="handleFileUploadProgress"
  50. :on-success="handleFileSuccess"
  51. :auto-upload="false"
  52. drag
  53. >
  54. <el-icon class="el-icon--upload">
  55. <upload-filled />
  56. </el-icon>
  57. <div class="el-upload__text">
  58. 将文件拖到此处,或<em>点击上传</em>
  59. </div>
  60. <template #tip>
  61. <div class="el-upload__tip text-center">
  62. <div class="el-upload__tip">
  63. <!-- <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据 -->
  64. </div>
  65. <span>仅允许导入xls、xlsx格式文件。</span>
  66. <el-link
  67. type="primary"
  68. :underline="false"
  69. style="font-size: 12px; vertical-align: baseline"
  70. @click="importTemplate"
  71. >下载模板</el-link
  72. >
  73. </div>
  74. </template>
  75. </el-upload>
  76. </el-form-item>
  77. </el-col>
  78. </el-row>
  79. </el-form>
  80. <template #footer>
  81. <div class="dialog-footer">
  82. <el-button
  83. type="primary"
  84. icon="Finished"
  85. size="small"
  86. @click="submitForm"
  87. >确 定</el-button
  88. >
  89. <el-button icon="close" size="small" @click="cancel">取 消</el-button>
  90. </div>
  91. </template>
  92. </el-dialog>
  93. </template>
  94. <script setup>
  95. import { getToken, getTenant } from "@/utils/auth";
  96. import { addCompany } from "@/api/business/crm/company";
  97. import CustomerFormCom from "@/components/CustomerFormCom";
  98. import useUserStore from "@/store/modules/user";
  99. import { listSource } from "@/api/settings/source";
  100. import { deepClone } from "@/utils";
  101. // import { incomeDefault, taxTypes, confirmDefault } from "@/utils/default"
  102. const { proxy } = getCurrentInstance();
  103. /** 父组件传参 */
  104. const props = defineProps({
  105. getList: {
  106. type: Function,
  107. default: () => {},
  108. },
  109. });
  110. const { getList } = toRefs(props);
  111. /** 字典数组区 */
  112. const { develop_type } = proxy.useDict("develop_type");
  113. /** 表单抽屉 页变量 */
  114. const title = ref("");
  115. const loading = ref(false);
  116. const multiple = ref(true);
  117. const visible = ref(false);
  118. const editStatus = ref(false);
  119. const isFullscreen = ref(false);
  120. const addDetailNum = ref(1);
  121. const currentMember = {};
  122. const provinces = ref(proxy.region.getProvinces());
  123. provinces.value.unshift({ code: "", name: "全部" });
  124. const cities = ref([]);
  125. const districts = ref([]);
  126. const sourceCategories = ref([]);
  127. const addType = ref(1);
  128. watch(addType, (value) => {
  129. switch (value) {
  130. case "1":
  131. break;
  132. case "2":
  133. break;
  134. default:
  135. break;
  136. }
  137. });
  138. const webHost = import.meta.env.VITE_APP_BASE_API;
  139. const setHeaders = {
  140. Authorization: getToken(),
  141. };
  142. const data = reactive({
  143. form: {},
  144. followData: {},
  145. rules: {
  146. name: [{ required: true, message: "客户名称不能为空", trigger: "blur" }],
  147. sourceCategoryName: [
  148. { validator: sourceValidator, trigger: "blur" },
  149. { required: true, message: "客户来源不能为空", trigger: "blur" },
  150. ],
  151. },
  152. });
  153. const addComRef = ref(null);
  154. /*** 客户导入参数 */
  155. const upload = reactive({
  156. // 是否禁用上传
  157. isUploading: false,
  158. // 设置上传的请求头部
  159. headers: { Authorization: "Bearer " + getToken(), tenantId: getTenant() },
  160. // 上传的地址
  161. url: "/ezhizao-yzbh-crm/business/company/importData",
  162. });
  163. function sourceValidator(rule, value, callback) {
  164. console.log(form.value.reffererDataSource, form.value.sourceName);
  165. if (form.value.sourceCategoryName === "") {
  166. callback(new Error("来源类型不能为空"));
  167. return;
  168. }
  169. if (
  170. form.value.referrerDataSource !== "" &&
  171. form.value.referrerDataSource != null &&
  172. form.value.sourceName === ""
  173. ) {
  174. callback(new Error("来源不能为空"));
  175. return;
  176. }
  177. return callback();
  178. }
  179. const contactorEmptyData = {
  180. id: null,
  181. name: "",
  182. position: "",
  183. gender: "男",
  184. phone: "",
  185. email: "",
  186. isMain: "是",
  187. remark: "",
  188. };
  189. const companyEmptyData = {
  190. id: null,
  191. code: "",
  192. name: "",
  193. oldName: "",
  194. shortName: "",
  195. ownerId: "",
  196. ownerName: "",
  197. sourceCategoryId: "",
  198. sourceCategoryName: "",
  199. sourceId: "",
  200. sourceName: "",
  201. stageId: "",
  202. stageName: "",
  203. phone: "",
  204. email: "",
  205. contactAddress: "",
  206. remark: "",
  207. socialCreditCode: "",
  208. mainBusinessId: "",
  209. mainBusinessName: "",
  210. typeId: "",
  211. typeName: "",
  212. legalRepresentative: "",
  213. foundationDate: "",
  214. licenceDate: "",
  215. businessStartDate: "",
  216. collectionMethod: "",
  217. businessEndDate: "",
  218. isPermanentlyEffective: "",
  219. registerMoney: "",
  220. registerMoneyUnitId: "",
  221. registerMoneyUnitName: "",
  222. provinceCode: "",
  223. province: "",
  224. cityCode: "",
  225. city: "",
  226. districtCode: "",
  227. district: "",
  228. address: "",
  229. businessField: "",
  230. taxTypeId: "",
  231. taxTypeName: "",
  232. taxDeclarationCategoryId: "",
  233. taxDeclarationCategoryName: "",
  234. isZero: "",
  235. taxDishId: "",
  236. taxDishName: "",
  237. competentTaxAuthority: "",
  238. annualIncome: "",
  239. taxType: "",
  240. taxCollectorName: "",
  241. taxCollectorPhone: "",
  242. taxMonth: "",
  243. openingBank: "",
  244. bankAccount: "",
  245. companyTags: [],
  246. companyTagIds: [],
  247. contactors: [],
  248. serviceTeams: [],
  249. companyFiles: [],
  250. stores: [],
  251. creatorId: useUserStore().user.id,
  252. };
  253. const followQuery = ref({});
  254. const { form, rules, followData } = toRefs(data);
  255. /*********************** 表单页方法 ****************************/
  256. /** 抽屉打开 */
  257. function open() {
  258. reset();
  259. visible.value = true;
  260. }
  261. function init() {
  262. listSource()
  263. .then((res) => {
  264. // console.log(res)
  265. sourceCategories.value = res.rows;
  266. // console.log(sourceCategories.value)
  267. })
  268. .catch((err) => {
  269. console.log(err);
  270. });
  271. }
  272. function reset() {
  273. form.value = deepClone(companyEmptyData);
  274. // console.log(addComRef.value)
  275. if (addComRef.value != null) addComRef.value.reset();
  276. }
  277. function cancel() {
  278. visible.value = false;
  279. }
  280. function submitForm() {
  281. if (addType.value === 1) {
  282. proxy.$refs["companyRef"].validate((valid) => {
  283. if (valid) {
  284. addCompany(form.value)
  285. .then((res) => {
  286. console.log(res);
  287. visible.value = false;
  288. getList.value();
  289. // emit('success')
  290. })
  291. .catch((err) => {
  292. console.log(err);
  293. });
  294. }
  295. });
  296. } else {
  297. submitFileForm();
  298. }
  299. }
  300. const importTemplate = () => {
  301. proxy.download(
  302. "/business/company/importTemplate",
  303. {},
  304. `company_template${new Date().getTime()}.xlsx`
  305. );
  306. };
  307. /**文件上传中处理 */
  308. const handleFileUploadProgress = (event, file, fileList) => {
  309. upload.isUploading = true;
  310. };
  311. /** 文件上传成功处理 */
  312. const handleFileSuccess = (response, file, fileList) => {
  313. upload.open = false;
  314. upload.isUploading = false;
  315. proxy.$refs["uploadRef"].handleRemove(file);
  316. proxy.$alert(
  317. "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
  318. response.msg +
  319. "</div>",
  320. "导入结果",
  321. { dangerouslyUseHTMLString: true }
  322. );
  323. getList.value();
  324. };
  325. /** 提交上传文件 */
  326. function submitFileForm() {
  327. proxy.$refs["uploadRef"].submit();
  328. }
  329. // 暴露给父组件的方法
  330. defineExpose({
  331. open,
  332. });
  333. init();
  334. </script>
  335. <style></style>