index.vue 18 KB

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