index.vue 19 KB

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