index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container" style="display:flex;justify-content: space-between;">
  5. <div>
  6. <el-button type="primary" size="small" icon="Plus" @click="handleAdd"
  7. v-hasPermi="['business:company:add']">新增</el-button>
  8. <el-button type="danger" size="small" icon="Delete" :disabled="multiple" @click="handleDelete"
  9. v-hasPermi="['business:company:remove']">删除</el-button>
  10. <el-dropdown trigger="click">
  11. <el-button type="primary" size="small">
  12. 其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
  13. </el-button>
  14. <template #dropdown>
  15. <el-dropdown-menu>
  16. <el-dropdown-item @click="handleAdviser()" v-if="viewAdviser('business:company:adviser')" icon="Operation">
  17. 设置客服</el-dropdown-item>
  18. <el-dropdown-item @click="handleLeader()" v-if="viewAdviser('business:company:leader')" icon="Operation">
  19. 设置负责人</el-dropdown-item>
  20. <el-dropdown-item type="warning" size="small" icon="Download" @click="handleExport"
  21. v-if="viewAdviser('business:company:export')">
  22. 导出</el-dropdown-item>
  23. </el-dropdown-menu>
  24. </template>
  25. </el-dropdown>
  26. <el-button style="margin-left: 5px;" type="primary" size="small" icon="Plus"
  27. @click="exportZero">导入是否零申报</el-button>
  28. </div>
  29. <!-- <el-dropdown v-hasPermi="['business:company:Migration']" style="" trigger="click">-->
  30. <!-- <el-button type="primary" size="small">-->
  31. <!-- 迁移客户<el-icon class="el-icon&#45;&#45;right"><arrow-down /></el-icon>-->
  32. <!-- </el-button>-->
  33. <!-- <template #dropdown>-->
  34. <!-- <el-dropdown-menu>-->
  35. <!-- <el-dropdown-item @click="handleMigration(0)">-->
  36. <!-- 发起迁移</el-dropdown-item>-->
  37. <!-- <el-dropdown-item @click="handleMigration(1)">-->
  38. <!-- 接收迁移</el-dropdown-item>-->
  39. <!-- </el-dropdown-menu>-->
  40. <!-- </template>-->
  41. <!-- </el-dropdown>-->
  42. </div>
  43. <!-- 搜索区 -->
  44. <el-form class="list-search-container" size="small" :model="queryParams" ref="queryRef" :inline="true">
  45. <el-form-item label="客户名称:" prop="name">
  46. <el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery"
  47. style="width: 200px" />
  48. </el-form-item>
  49. <el-form-item label="税号:" prop="socialCreditCode">
  50. <el-input v-model="queryParams.socialCreditCode" style="width: 200px" placeholder="税号" clearable
  51. @keyup.enter="handleQuery" />
  52. </el-form-item>
  53. <el-form-item label="客户负责人:" prop="leaderName">
  54. <el-input v-model="queryParams.leaderName" style="width: 200px" placeholder="请输入客户负责人" clearable
  55. @keyup.enter="handleQuery" />
  56. </el-form-item>
  57. <el-form-item label="历史使用名:" prop="oldName">
  58. <el-input v-model="queryParams.oldName" style="width: 200px" placeholder="请输入历史使用名" clearable
  59. @keyup.enter="handleQuery" />
  60. </el-form-item>
  61. <el-form-item>
  62. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  63. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  64. </el-form-item>
  65. </el-form>
  66. <div v-if="flag && flag2 && tenant.versionId !== '4'">
  67. <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
  68. <el-tab-pane label=" 全部" name="first">
  69. </el-tab-pane>
  70. <el-tab-pane label="我的" name="second">
  71. </el-tab-pane>
  72. </el-tabs>
  73. </div>
  74. <!-- 列表区 -->
  75. <el-table v-loading="loading" :data="list" size="small" border height="100%"
  76. @selection-change="handleSelectionChange">
  77. <el-table-column type="selection" width="55" :resizable="false" align="center" />
  78. <el-table-column label="公司名称" :resizable="false" min-width="250" align="center">
  79. <template #default="scope">
  80. <el-button link type="primary" size="small" @click="handleInfo(scope.row)"
  81. v-hasPermi="['business:company:info']">{{ scope.row.name }}
  82. </el-button>
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="所属区域" prop="provinceCode" :resizable="false" min-width="150" align="center">
  86. <template #default="scope">
  87. <span>{{
  88. provinceCodeFormat(scope.row)
  89. }}</span>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="年收入" :resizable="false" prop="annualIncome" min-width="100" align="center" />
  93. <el-table-column label="纳税性质" prop="taxType" min-width="90" :resizable="false" align="center" />
  94. <el-table-column label="是否零申报" prop="isZero" :resizable="false" width="75" align="center">
  95. <template #default="scope">
  96. {{
  97. scope.row.isZero === 1 ? "是" : scope.row.isZero === 0 ? "否" : ""
  98. }}
  99. </template>
  100. </el-table-column>
  101. <el-table-column label="税号" prop="socialCreditCode" min-width="200" :resizable="false" align="center" />
  102. <el-table-column label="负责人" prop="leaderName" :resizable="false" min-width="100" align="center" />
  103. <el-table-column label="客服" min-width="100" prop="adviserName" :resizable="false" align="center" />
  104. <el-table-column label="客户跟进" :resizable="false" width="65" align="center" fixed="right">
  105. <template #default="scope">
  106. <el-button link type="primary" size="small" @click="handleFollow(scope.row)"
  107. v-hasPermi="['business:company:follow']">跟进</el-button>
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="操作" align="center" width="80" :resizable="false" fixed="right">
  111. <template #default="scope">
  112. <el-button link type="primary" size="small" @click="handleInfo(scope.row)"
  113. v-hasPermi="['business:company:info']">详细信息</el-button>
  114. </template>
  115. </el-table-column>
  116. </el-table>
  117. <!-- 分页 -->
  118. <!-- <div class="pagination-container"> -->
  119. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  120. v-model:limit="queryParams.pageSize" @pagination="getList" />
  121. <!-- </div> -->
  122. <!-- 表单 -->
  123. <company-form ref="companyRef" :get-list="getList"></company-form>
  124. <migration-view ref="migrationViewRef" :get-com-list="getList"></migration-view>
  125. <exportColumn ref="exportColumnRef"></exportColumn>
  126. <add ref="addRef" :get-list="getList"></add>
  127. <exports ref="exportRef" :get-list="getList"></exports>
  128. <el-dialog :title="title" v-model="open" width="500px" append-to-body draggable @close="cancel"
  129. :close-on-click-modal="false">
  130. <el-form ref="dictRef" :model="form" :rules="rules" label-width="100">
  131. <el-form-item :label="title" :prop="content">
  132. <el-autocomplete style="width: 100%" :fetch-suggestions="querySearchAsync" :trigger-on-focus="true"
  133. v-model="selectionName" :placeholder="content" popper-class="my-autocomplete"
  134. @select="handleSelectEmployee">
  135. <template #default="{ item }">
  136. <div style="
  137. display: flex;
  138. flex-direction: row;
  139. justify-content: space-between;
  140. ">
  141. <div class="name" style="font-size: 12px">
  142. {{ item.nickName }}
  143. </div>
  144. <span class="code" style="font-size: 10px; color: darkgrey">{{
  145. item.userName
  146. }}</span>
  147. </div>
  148. </template>
  149. </el-autocomplete>
  150. </el-form-item>
  151. </el-form>
  152. <template #footer>
  153. <div class="dialog-footer">
  154. <el-button type="primary" size="small" icon="Finished" @click="submitForm">确 定</el-button>
  155. <el-button size="small" icon="Close" @click="cancel">取 消</el-button>
  156. </div>
  157. </template>
  158. </el-dialog>
  159. </div>
  160. </template>
  161. <script setup name="Crm">
  162. import exportColumn from "./ExportColumn";
  163. import companyForm from "./form";
  164. import { listUser } from "@/api/system/user";
  165. import add from "./add.vue";
  166. import exports from "./export.vue"
  167. import { addBin } from "@/api/business/bin";
  168. import {
  169. listCompany,
  170. getCompany,
  171. delCompany,
  172. setCompanyLeader,
  173. setCompanyAdviser,
  174. initArea,
  175. } from "@/api/business/crm/company";
  176. import useUserStore from "@/store/modules/user";
  177. import migrationView from "@/views/business/crm/company/migrationView"
  178. const { proxy } = getCurrentInstance();
  179. /** 字典数组区 */
  180. const { develop_type } = proxy.useDict("develop_type");
  181. /** 主页面 变量 */
  182. const list = ref([]);
  183. const permissions = useUserStore().permissions;
  184. const all_permission = "*:*:*";
  185. const loading = ref(false);
  186. const tenant = useUserStore().tenant;
  187. const ids = ref([]);
  188. const single = ref(true);
  189. const multiple = ref(true);
  190. const total = ref(0);
  191. const choiceType = ref("");
  192. const flag = ref(checkPermission(['business:company:person']))
  193. const flag2 = ref(checkPermission(['business:company:myself']))
  194. const activeName = flag.value ? ref('first') : ref('second');
  195. const open = ref(false);
  196. const title = ref("");
  197. const content = ref("");
  198. const oneself = ref(false);
  199. const selectionName = ref("");
  200. const selectionUser = ref({});
  201. const exportColumnRef = ref(null);
  202. const migrationViewRef = ref(null);
  203. /** 查询 对象 */
  204. const queryParams = ref({
  205. pageNum: 1,
  206. pageSize: 20,
  207. orderByColumn: "create_time",
  208. name: null,
  209. standard: null,
  210. num: null,
  211. principal: tenant.versionId !== '4' && !flag.value ? useUserStore().user.userId : null,
  212. });
  213. /*********************** 列表页方法 ****************************/
  214. onActivated(() => {
  215. // 你的逻辑
  216. getList();
  217. });
  218. /** 查询项目信息列表 */
  219. function getList() {
  220. loading.value = true;
  221. listCompany(queryParams.value).then((response) => {
  222. list.value = response.rows;
  223. total.value = response.total;
  224. loading.value = false;
  225. });
  226. }
  227. //判断是否有权限
  228. function viewAdviser(quer) {
  229. return permissions.includes(all_permission) || permissions.includes(quer);
  230. }
  231. function handleClick(tab) {
  232. console.log(tab.props.name)
  233. if (tab.props.name === "second") {
  234. oneself.value = true
  235. handleOneself()
  236. } else {
  237. oneself.value = false
  238. handleOneself()
  239. }
  240. }
  241. /** 搜索按钮操作 */
  242. function handleQuery() {
  243. queryParams.value.pageNum = 1;
  244. getList();
  245. }
  246. /** 重置按钮操作 */
  247. function resetQuery() {
  248. proxy.resetForm("queryRef");
  249. if (activeName.value != null && activeName.value === 'second') {
  250. queryParams.value.principal = useUserStore().user.userId;
  251. }
  252. handleQuery();
  253. }
  254. // 多选框选中数据
  255. function handleSelectionChange(selection) {
  256. ids.value = selection.map((item) => item.id);
  257. single.value = selection.length != 1;
  258. multiple.value = !selection.length;
  259. }
  260. /** 新增按钮操作 */
  261. function handleAdd() {
  262. proxy.$refs.addRef.open();
  263. }
  264. /** 新增导入操作 */
  265. function exportZero() {
  266. proxy.$refs.exportRef.open();
  267. }
  268. /** 是否为自己负责 */
  269. function handleOneself() {
  270. if (oneself.value) {
  271. queryParams.value.principal = useUserStore().user.userId;
  272. } else {
  273. queryParams.value.principal = null;
  274. }
  275. getList();
  276. }
  277. function checkPermission(templatePermission) {
  278. const all_permission = "*:*:*";
  279. const permissions = useUserStore().permissions;
  280. const hasPermissions = permissions.some((permission) => {
  281. return (
  282. all_permission === permission || templatePermission.includes(permission)
  283. );
  284. });
  285. return hasPermissions;
  286. }
  287. /** 修改按钮操作 */
  288. function handleUpdate(row) {
  289. const id = row.id || ids.value;
  290. // console.log(id)
  291. proxy.$refs.companyRef.open(id);
  292. }
  293. /** 删除按钮操作 */
  294. function handleDelete(row) {
  295. const _ids = row.id || ids.value;
  296. proxy.$modal
  297. .confirm("是否确认删除选中的数据项?")
  298. .then(function () {
  299. return addBin(_ids);
  300. })
  301. .then(() => {
  302. getList();
  303. proxy.$modal.msgSuccess("删除成功!");
  304. })
  305. .catch(() => { });
  306. }
  307. /** 导出按钮操作 */
  308. function handleExport() {
  309. exportColumnRef.value.open(queryParams.value);
  310. }
  311. function handleAdviser() {
  312. const updateIds = ids.value;
  313. if (updateIds.length == 0) {
  314. proxy.$modal.msgError("请至少选择一条数据!");
  315. return;
  316. }
  317. open.value = true;
  318. title.value = "设置客服";
  319. content.value = "输入客服名称";
  320. choiceType.value = "adviser";
  321. }
  322. function handleLeader() {
  323. const updateIds = ids.value;
  324. if (updateIds.length == 0) {
  325. proxy.$modal.msgError("请至少选择一条数据!");
  326. return;
  327. }
  328. open.value = true;
  329. title.value = "设置负责人";
  330. content.value = "输入负责人名称";
  331. choiceType.value = "leader";
  332. }
  333. function handleInfo(row) {
  334. proxy.$refs.companyRef.open(row.id);
  335. }
  336. /** 输入框输出建议 */
  337. const querySearchAsync = (queryString, cb) => {
  338. const query = { keyword: queryString };
  339. listUser(query).then((res) => {
  340. cb(res.rows);
  341. console.log(res.rows);
  342. });
  343. };
  344. function handleSelectEmployee(item) {
  345. console.log(item);
  346. selectionName.value = item.nickName;
  347. selectionUser.value = item;
  348. }
  349. function submitForm() {
  350. if (selectionUser.value == null || selectionUser.value.userId == null) {
  351. proxy.$modal.msgError("请选择用户!");
  352. return;
  353. }
  354. if (choiceType.value == "adviser") {
  355. setCompanyAdviser({
  356. ids: ids.value,
  357. adviserId: selectionUser.value.userId,
  358. }).then((response) => {
  359. proxy.$modal.msgSuccess("设置完成!");
  360. open.value = false;
  361. cancel();
  362. getList();
  363. });
  364. } else if (choiceType.value == "leader") {
  365. setCompanyLeader({
  366. ids: ids.value,
  367. leaderId: selectionUser.value.userId,
  368. }).then((response) => {
  369. proxy.$modal.msgSuccess("设置完成!");
  370. open.value = false;
  371. cancel();
  372. getList();
  373. });
  374. }
  375. }
  376. function handleFollow(row) {
  377. proxy.$refs.companyRef.open(row.id, "follow-form");
  378. }
  379. function handleArea() {
  380. initArea();
  381. }
  382. function cancel() {
  383. open.value = false;
  384. selectionName.value = "";
  385. selectionUser.value = "";
  386. }
  387. getList();
  388. const handleMigration = (falg) =>{
  389. migrationViewRef.value.open(falg);
  390. }
  391. const provinceCodeFormat = (row)=>{
  392. const array = [];
  393. if(row.province !== undefined && row.province.length > 0 ){
  394. array.push(row.province);
  395. }
  396. if(row.city !== undefined && row.city.length > 0 ){
  397. array.push(row.city);
  398. }
  399. if(row.district !== undefined && row.district.length > 0 ){
  400. array.push(row.district);
  401. }
  402. // array.push(row.province || "");
  403. // array.push(row.city|| "");
  404. // array.push(row.district|| "");
  405. return array.join('-');
  406. }
  407. </script>
  408. <style scope></style>