index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container">
  5. <el-button type="primary" size="small" icon="Plus" @click="handleAdd"
  6. v-hasPermi="['business:archive:order:add']">新增</el-button>
  7. <!-- <el-button type="danger" size="small" icon="Delete" :disabled="multiple" @click="handleDelete"
  8. v-hasPermi="['business:archive:order:remove']">删除</el-button> -->
  9. <el-dropdown trigger="click">
  10. <el-button type="primary" size="small">
  11. 其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
  12. </el-button>
  13. <template #dropdown>
  14. <el-dropdown-menu>
  15. <el-dropdown-item icon="Delete" :disabled="single" @click="handleAlter" v-if="viewAlter()">
  16. 合同变更</el-dropdown-item>
  17. <el-dropdown-item icon="Delete" :disabled="single" @click="handleDissolution" v-if="viewDissolution()">
  18. 合同解除</el-dropdown-item>
  19. <el-dropdown-item icon="Delete" :disabled="multiple" @click="handleDelete" v-if="viewDelete()">
  20. 删除合同</el-dropdown-item>
  21. <el-dropdown-item icon="Delete" :disabled="multiple" @click="handleBinDelete" v-if="viewBinDelete()">
  22. 放入回收站</el-dropdown-item>
  23. <el-dropdown-item icon="Download" @click="handleExport" v-if="viewExport()"
  24. v-hasPermi="['business:archive:order:export']">
  25. 导出</el-dropdown-item>
  26. <el-dropdown-item icon="Upload" @click="handleImport" v-hasPermi="['business:archive:order:export']"
  27. v-if="viewExport()">导入</el-dropdown-item>
  28. <!-- <el-dropdown-item type="warning" size="small" icon="Download" @click="handleArea"
  29. v-hasPermi="['business:archive:order:export']"> area</el-dropdown-item> -->
  30. </el-dropdown-menu>
  31. </template>
  32. </el-dropdown>
  33. <!-- <el-button type="warning" size="small" icon="Download" @click="handleExport"
  34. v-hasPermi="['business:archive:order:export']">导出</el-button> -->
  35. <!--<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>-->
  36. </div>
  37. <!-- 搜索区 -->
  38. <el-form class="list-search-container" size="small" :model="queryParams" ref="queryRef" :inline="true"
  39. label-width="68px">
  40. <el-form-item label="客户名称:" prop="companyName">
  41. <el-input v-model="queryParams.companyName" placeholder="请输入客户名称" clearable style="width: 200px"
  42. @keyup.enter="handleQuery" />
  43. </el-form-item>
  44. <el-form-item label="合同编号" prop="contractNo">
  45. <el-input v-model="queryParams.contractNo" placeholder="请输入客户名称" clearable style="width: 200px"
  46. @keyup.enter="handleQuery" />
  47. </el-form-item>
  48. <el-form-item label="客户标签" >
  49. <el-select v-model="queryParams.customerLabelId" style="width:100%" multiple >
  50. <el-option v-for="item in options" :key="item.id" :label="item.lable" :value="item.id" />
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item label="合同类型:" prop="contractType">
  54. <el-select size="small" v-model="queryParams.contractType" placeholder="服务类型" clearable style="width: 100px">
  55. <el-option v-for="item in contractTypes" :key="item.value" :label="item.label" :value="item.value" />
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item label="服务类型:" prop="serviceType">
  59. <el-select size="small" v-model="queryParams.serviceType" placeholder="合同类型" clearable style="width: 100px">
  60. <el-option v-for="item in serviceTypes" :key="item.value" :label="item.label" :value="item.value" />
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
  65. <el-button icon="operation" @click="moreSearch = true">更多</el-button>
  66. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  67. </el-form-item>
  68. </el-form>
  69. <!-- 列表区 -->
  70. <el-table v-loading="loading" :data="orderList" size="small" border height="100%"
  71. @selection-change="handleSelectionChange">
  72. <el-table-column type="selection" width="55" align="center" />
  73. <el-table-column label="客户名称" align="center" prop="companyName" min-width="250" />
  74. <el-table-column label="税号" align="center" prop="socialCreditCode" min-width="200" />
  75. <el-table-column label="合同编号" align="center" prop="contractNo" min-width="150" />
  76. <el-table-column label="签约日期" align="center" prop="formDate" width="100">
  77. <template #default="scope">
  78. <span>{{ parseTime(scope.row.formDate, "{y}-{m}-{d}") }}</span>
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="签约金额" header-align="center" align="right" prop="trueAmount" width="80">
  82. <template #default="scope">{{
  83. scope.row.trueAmount.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, "$&,")
  84. }}</template>
  85. </el-table-column>
  86. <el-table-column label="签单人" align="center" prop="signerName" min-width="120" />
  87. <el-table-column label="合同来源" align="center" prop="sourceCategoryName" min-width="120" />
  88. <el-table-column label="客户标签" align="center" prop="customerLabelName" min-width="120" >
  89. </el-table-column>
  90. <el-table-column label="审核状态" align="center" prop="verifyStatus" width="110">
  91. <template #default="scope">
  92. <dict-tag :options="contract_verify_status" :value="scope.row.verifyStatus" />
  93. </template>
  94. </el-table-column>
  95. <el-table-column label="合同类型" align="center" prop="contractType" width="80">
  96. <template #default="scope">
  97. {{ scope.row.contractType === 0 ? "新签" : "续签" }}
  98. </template>
  99. </el-table-column>
  100. <el-table-column label="服务类型" align="center" prop="serviceType" width="80">
  101. <template #default="scope">
  102. {{ scope.row.serviceType === 1 ? "循环" : "代办" }}
  103. </template>
  104. </el-table-column>
  105. <el-table-column label="合同状态" width="110" align="center" prop="status">
  106. <template #default="scope">
  107. <dict-tag :options="contract_status" :value="scope.row.status" />
  108. </template>
  109. </el-table-column>
  110. <el-table-column label="操作" fixed="right" align="center" width="130" class-name="small-padding fixed-width">
  111. <template #default="scope">
  112. <el-button link type="primary" size="small" @click="handleUpdate(scope.row)"
  113. v-hasPermi="['business:archive:order:edit']">查看</el-button>
  114. <el-button link type="danger" size="small" @click="handleDelete(scope.row)"
  115. v-hasPermi="['business:archive:order:remove']">删除</el-button>
  116. </template>
  117. </el-table-column>
  118. </el-table>
  119. <contract-form ref="contractRef" :get-list="getList" />
  120. <import-excel-dialog ref="importExcelDialogRef" :get-list="getList" />
  121. <!-- 分页 -->
  122. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
  123. v-model:limit="queryParams.pageSize" @pagination="getList" />
  124. <el-dialog title="更多搜索" v-model="moreSearch" width="620px" append-to-body size="small" draggable
  125. :close-on-click-modal="false">
  126. <el-form :model="queryParams" ref="queryRef" size="small" label-width="100">
  127. <el-row :gutter="20">
  128. <el-col :span="12">
  129. <el-form-item label="客户名称:" prop="companyName">
  130. <el-input v-model="queryParams.companyName" placeholder="请输入客户名称" clearable style="width: 200px"
  131. @keyup.enter="handleQuery" />
  132. </el-form-item>
  133. <el-form-item label="服务类型:" prop="serviceType">
  134. <el-select size="small" v-model="queryParams.serviceType" placeholder="合同类型" clearable
  135. style="width: 100%">
  136. <el-option v-for="item in serviceTypes" :key="item.value" :label="item.label" :value="item.value" />
  137. </el-select>
  138. </el-form-item>
  139. <el-form-item label="代理记账:" prop="isKeepAccount">
  140. <el-select size="small" v-model="queryParams.isKeepAccount" placeholder="是否记账" clearable
  141. style="width: 100%">
  142. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  143. </el-select>
  144. </el-form-item>
  145. <el-form-item label="公积金代缴:" prop="isHousingFund">
  146. <el-select size="small" v-model="queryParams.isHousingFund" placeholder="是否代缴公积金" clearable
  147. style="width: 100%">
  148. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  149. </el-select>
  150. </el-form-item>
  151. <el-form-item label="注册:" prop="isRegister">
  152. <el-select size="small" v-model="queryParams.isRegister" placeholder="是否注册" clearable style="width: 100%">
  153. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  154. </el-select>
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="12">
  158. <el-form-item label="合同类型:" prop="contractType">
  159. <el-select size="small" v-model="queryParams.contractType" placeholder="服务类型" clearable
  160. style="width: 100%">
  161. <el-option v-for="item in contractTypes" :key="item.value" :label="item.label" :value="item.value" />
  162. </el-select>
  163. </el-form-item>
  164. <el-form-item label="签约日期:" prop="formDate">
  165. <el-date-picker v-model="queryParams.formDate" type="daterange" clearable
  166. format="YYYY - MM - DD " value-format="YYYY-MM-DD" range-separator="至" start-placeholder="业务日期"
  167. end-placeholder="业务日期" style="width: 100%;"></el-date-picker>
  168. </el-form-item>
  169. <el-form-item label="社保代缴:" prop="isSocialSecurity">
  170. <el-select size="small" v-model="queryParams.isSocialSecurity" placeholder="是否代缴社保" clearable
  171. style="width: 100%">
  172. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  173. </el-select>
  174. </el-form-item>
  175. <el-form-item label="返税申报:" prop="isReturnTax">
  176. <el-select size="small" v-model="queryParams.isReturnTax" placeholder="是否申报返税" clearable
  177. style="width: 100%">
  178. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  179. </el-select>
  180. </el-form-item>
  181. <el-form-item label="变更:" prop="isAlter">
  182. <el-select size="small" v-model="queryParams.isAlter" placeholder="是否变更" clearable style="width: 100%">
  183. <el-option v-for="item in yesOrNo" :key="item.value" :label="item.label" :value="item.value" />
  184. </el-select>
  185. </el-form-item>
  186. </el-col>
  187. </el-row>
  188. </el-form>
  189. <template #footer>
  190. <div class="dialog-footer">
  191. <el-button type="primary" icon="Finished" size="small" @click="handleQuery">确 定</el-button>
  192. <el-button icon="close" size="small" @click="moreSearch = false">取 消</el-button>
  193. </div>
  194. </template>
  195. </el-dialog>
  196. </div>
  197. </template>
  198. <script setup name="Order">
  199. import { dissolutionOrder } from "../../../../api/business/crm/contract";
  200. import contractForm from "./form";
  201. import useUserStore from "@/store/modules/user";
  202. import {
  203. listOrder,
  204. delOrder,
  205. delBinOrder,
  206. exportOrder,
  207. } from "@/api/business/crm/contract";
  208. import { listLableNoPage } from "@/api/business/lable";
  209. import importExcelDialog from "./importExcelDialog.vue";
  210. import { yesOrNo } from "@/utils/default";
  211. const { proxy } = getCurrentInstance();
  212. /** 字典数组区 */
  213. /** 查询 对象 */
  214. const orderList = ref([]);
  215. const loading = ref(true);
  216. const ids = ref([]);
  217. const single = ref(true);
  218. const multiple = ref(true);
  219. const total = ref(0);
  220. const permissions = useUserStore().permissions;
  221. const all_permission = "*:*:*";
  222. const importExcelDialogRef = ref(null);
  223. const moreSearch = ref(false);
  224. const options = ref([]);
  225. const contractTypes = ref([
  226. {
  227. label: "新签",
  228. value: 0,
  229. },
  230. {
  231. label: "续签",
  232. value: 1,
  233. },
  234. ]);
  235. const serviceTypes = ref([
  236. {
  237. label: "循环服务",
  238. value: 1,
  239. },
  240. {
  241. label: "单次服务",
  242. value: 2,
  243. },
  244. ]);
  245. const { contract_verify_status } = proxy.useDict("contract_verify_status");
  246. const { contract_status } = proxy.useDict("contract_status");
  247. /** 查询对象 */
  248. const queryParams = ref({
  249. pageNum: 1,
  250. pageSize: 20,
  251. fromId: 0,
  252. orderByColumn: "create_time",
  253. category: null,
  254. code: null,
  255. name: null,
  256. shortName: null,
  257. companyName: null,
  258. oldName: null,
  259. owner: null,
  260. phone: null,
  261. email: null,
  262. contactAddress: null,
  263. source: null,
  264. type: null,
  265. socialCreditCode: null,
  266. mainBusiness: null,
  267. legalRepresentative: null,
  268. foundationDate: null,
  269. licenceDate: null,
  270. businessStartDate: null,
  271. businessEndDate: null,
  272. isPermanentlyEffective: null,
  273. registerMoney: null,
  274. registerMoneyUnit: null,
  275. provinceCode: null,
  276. province: null,
  277. cityCode: null,
  278. city: null,
  279. districtCode: null,
  280. district: null,
  281. address: null,
  282. businessField: null,
  283. taxType: null,
  284. isZero: null,
  285. competentTaxAuthority: null,
  286. taxCollectorName: null,
  287. taxCollectorPhone: null,
  288. taxMonth: null,
  289. openingBank: null,
  290. bankAccount: null,
  291. annualIncome: null,
  292. governmentAccountNo: null,
  293. governmentPassword: null,
  294. socialSecurityAccountNo: null,
  295. socialSecurityPassword: null,
  296. employeePassword: null,
  297. housingFundPassword: null,
  298. housingFundUnitAccount: null,
  299. housingFundDeductionPassword: null,
  300. collectionMethod: null,
  301. quotaAmount: null,
  302. isPayOnWindow: null,
  303. isFirstSocialSecurity: null,
  304. isFirstHousingFund: null,
  305. customerLabelId:[],
  306. });
  307. /*********************** 方法区 ****************************/
  308. /** 查询company列表 */
  309. function getList() {
  310. loading.value = true;
  311. listOrder(queryParams.value).then((response) => {
  312. orderList.value = response.rows;
  313. total.value = response.total;
  314. loading.value = false;
  315. });
  316. }
  317. function viewAlter() {
  318. return (
  319. permissions.includes(all_permission) ||
  320. permissions.includes("business:archive:order:alter")
  321. );
  322. }
  323. function viewDissolution() {
  324. return (
  325. permissions.includes(all_permission) ||
  326. permissions.includes("business:archive:order:dissolution")
  327. );
  328. }
  329. function getOption(){
  330. listLableNoPage().then(res =>{
  331. options.value = res.data
  332. })
  333. }
  334. function viewDelete() {
  335. return (
  336. permissions.includes(all_permission) ||
  337. permissions.includes("business:archive:order:remove")
  338. );
  339. }
  340. function viewBinDelete() {
  341. return (
  342. permissions.includes(all_permission) ||
  343. permissions.includes("business:archive:order:bin")
  344. );
  345. }
  346. function viewExport() {
  347. return (
  348. permissions.includes(all_permission) ||
  349. permissions.includes("business:archive:order:export")
  350. );
  351. }
  352. /** 搜索按钮操作 */
  353. function handleQuery() {
  354. queryParams.value.pageNum = 1;
  355. getList();
  356. }
  357. /** 重置按钮操作 */
  358. function resetQuery() {
  359. proxy.resetForm("queryRef");
  360. handleQuery();
  361. }
  362. // 多选框选中数据
  363. function handleSelectionChange(selection) {
  364. ids.value = selection.map((item) => item.id);
  365. single.value = selection.length != 1;
  366. multiple.value = !selection.length;
  367. }
  368. /** 新增按钮操作 */
  369. function handleAdd() {
  370. proxy.$refs.contractRef.open();
  371. }
  372. /** 修改按钮操作 */
  373. function handleUpdate(row) {
  374. const id = row.id || ids.value;
  375. proxy.$refs.contractRef.open(id);
  376. }
  377. /** 删除按钮操作 */
  378. function handleDelete(row) {
  379. const _ids = row.id || ids.value;
  380. proxy.$modal
  381. .confirm("是否确认删除选中的数据项?")
  382. .then(function () {
  383. return delOrder(_ids);
  384. })
  385. .then(() => {
  386. getList();
  387. proxy.$modal.msgSuccess("删除成功!");
  388. })
  389. .catch(() => { });
  390. }
  391. /** 放入回收站按钮操作 */
  392. function handleBinDelete(row) {
  393. const _ids = row.id || ids.value;
  394. proxy.$modal
  395. .confirm("是否确认选中的数据项放入回收站?")
  396. .then(function () {
  397. return delBinOrder(_ids);
  398. })
  399. .then(() => {
  400. getList();
  401. proxy.$modal.msgSuccess("数据已放入回收站!");
  402. })
  403. .catch(() => { });
  404. }
  405. function handleAlter() {
  406. const id = ids.value;
  407. const row = orderList.value.find((item) => item.id === ids.value[0]);
  408. if (row.verifyStatus == 0) {
  409. proxy.$modal.msgError("未审核合同无法变更!");
  410. return;
  411. }
  412. if (row.status == 9) {
  413. proxy.$modal.msgError("已解除合同无法变更!");
  414. return;
  415. }
  416. proxy.$refs.contractRef.openSimple(id, "alterOrder");
  417. }
  418. function handleDissolution() {
  419. const row = orderList.value.find((item) => item.id === ids.value[0]);
  420. console.log(row);
  421. if (row.verifyStatus == 0) {
  422. proxy.$modal.msgError("未审核合同无法解除!");
  423. return;
  424. }
  425. proxy.$modal
  426. .confirm("是否确认解除合同?")
  427. .then(function () {
  428. return dissolutionOrder(row);
  429. })
  430. .then(() => {
  431. getList();
  432. proxy.$modal.msgSuccess("解除成功!");
  433. });
  434. // .catch(() => {});
  435. }
  436. /** 导出按钮操作 */
  437. function handleExport() {
  438. // proxy.download(
  439. // "business/archive/order/export",
  440. // {
  441. // ...queryParams.value,
  442. // },
  443. // `合同导出_${new Date().getTime()}.xlsx`
  444. // );
  445. exportOrder(queryParams.value);
  446. }
  447. function handleImport() {
  448. importExcelDialogRef.value.open();
  449. }
  450. getList();
  451. getOption();
  452. </script>