index.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <template>
  2. <div class="page-container list-container">
  3. <!-- 功能按钮区 -->
  4. <div class="list-btns-container">
  5. <el-button
  6. type="primary"
  7. size="small"
  8. icon="Plus"
  9. @click="handleAdd"
  10. v-hasPermi="['business:workOrder:add']"
  11. >新增</el-button
  12. >
  13. <!-- <el-button type="danger" size="small" icon="Delete" :disabled="multiple" @click="handleDelete"
  14. v-hasPermi="['business:workOrder:remove']">删除</el-button> -->
  15. <el-dropdown>
  16. <el-button type="primary" size="small">
  17. 其它<el-icon class="el-icon--right"><arrow-down /></el-icon>
  18. </el-button>
  19. <template #dropdown>
  20. <el-dropdown-menu>
  21. <el-dropdown-item
  22. icon="Download"
  23. @click="handleExport"
  24. v-hasPermi="['business:workOrder:export']"
  25. >
  26. 导出</el-dropdown-item
  27. >
  28. </el-dropdown-menu>
  29. </template>
  30. </el-dropdown>
  31. </div>
  32. <!-- 搜索区 -->
  33. <el-form
  34. class="list-search-container"
  35. size="small"
  36. :model="queryParams"
  37. ref="queryRef"
  38. :inline="true"
  39. label-width="68px"
  40. >
  41. <el-form-item label="客户名称:" prop="companyName">
  42. <el-input
  43. v-model="queryParams.companyName"
  44. placeholder="请输入客户名称"
  45. style="width: 150px"
  46. clearable
  47. @keyup.enter="handleQuery"
  48. />
  49. </el-form-item>
  50. <el-form-item>
  51. <el-button type="primary" icon="Search" @click="handleQuery"
  52. >搜索</el-button
  53. >
  54. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  55. </el-form-item>
  56. </el-form>
  57. <!-- 列表区 -->
  58. <el-table
  59. v-loading="loading"
  60. :data="orderList"
  61. size="small"
  62. border
  63. height="100%"
  64. @selection-change="handleSelectionChange"
  65. >
  66. <el-table-column type="selection" width="55" align="center" />
  67. <el-table-column
  68. label="客户名称"
  69. align="center"
  70. min-width="250"
  71. prop="companyName"
  72. />
  73. <el-table-column
  74. label="税号"
  75. align="center"
  76. min-width="180"
  77. prop="socialCreditCode"
  78. />
  79. <el-table-column
  80. label="服务内容"
  81. align="center"
  82. min-width="650"
  83. prop="remark"
  84. >
  85. <template #default="scope">
  86. <div>{{ scope.row.remark }}</div>
  87. </template>
  88. </el-table-column>
  89. <el-table-column label="工单执行人" align="center" width="130">
  90. <template #default="scope">{{ getTransactor(scope.row) }}</template>
  91. </el-table-column>
  92. </el-table>
  93. <el-dialog
  94. title="新增工单"
  95. v-model="formOpen"
  96. width="500px"
  97. append-to-body
  98. draggable
  99. >
  100. <el-form ref="dictRef" :model="form" label-width="100" size="small">
  101. <el-row :gutter="30">
  102. <el-col :span="24">
  103. <el-form-item label="客户名称:" prop="companyName">
  104. <el-autocomplete
  105. style="width: 100%"
  106. fit-input-width="300px"
  107. size="small"
  108. :fetch-suggestions="querySearchCompanyAsync"
  109. :trigger-on-focus="true"
  110. v-model="form.companyName"
  111. placeholder="请输入客户名称"
  112. @select="handleSelectCompany"
  113. >
  114. <template #append>
  115. <el-button icon="Plus" @click="showAddCompanyDialog">
  116. </el-button>
  117. </template>
  118. <template #default="{ item }">
  119. <div
  120. style="
  121. display: flex;
  122. flex-direction: row;
  123. justify-content: space-between;
  124. "
  125. >
  126. <div class="name" style="font-size: 12px">
  127. {{ item.name }}
  128. </div>
  129. <!-- <span class="code" style="font-size: 10px; color: darkgrey;">{{ item.code }}</span> -->
  130. </div>
  131. </template>
  132. </el-autocomplete>
  133. </el-form-item>
  134. <el-form-item label="服务内容:">
  135. <el-input
  136. v-model.trim="form.remark"
  137. type="textarea"
  138. size="small"
  139. :rows="4"
  140. maxlength="200"
  141. show-word-limit
  142. placeholder="服务内容"
  143. :clearable="true"
  144. />
  145. </el-form-item>
  146. </el-col>
  147. <el-col :span="24"> </el-col>
  148. </el-row>
  149. </el-form>
  150. <template #footer>
  151. <div class="dialog-footer">
  152. <el-button
  153. type="primary"
  154. icon="Finished"
  155. size="small"
  156. @click="saveHandler"
  157. >确 定</el-button
  158. >
  159. <el-button @click="formCancel" icon="close" size="small"
  160. >取 消</el-button
  161. >
  162. </div>
  163. </template>
  164. </el-dialog>
  165. <!-- 分页 -->
  166. <pagination
  167. v-show="total > 0"
  168. :total="total"
  169. v-model:page="queryParams.pageNum"
  170. v-model:limit="queryParams.pageSize"
  171. @pagination="getList"
  172. />
  173. <AddCompanyDialog ref="addCompanyDialogRef" />
  174. </div>
  175. </template>
  176. <script setup name="Company">
  177. // import contractForm from "./form";
  178. import {
  179. listWorkOrder,
  180. delWorkOrder,
  181. exportWorkOrder,
  182. addWorkOrder,
  183. exportNoContract,
  184. } from "@/api/business/crm/workOrder";
  185. import { listCompany } from "@/api/business/crm/company";
  186. import AddCompanyDialog from "../AddCompanyDialog.vue";
  187. import { ref } from "vue";
  188. // import workorderForm from "./form"
  189. const { proxy } = getCurrentInstance();
  190. /** 字典数组区 */
  191. /** 查询 对象 */
  192. const orderList = ref([]);
  193. const loading = ref(true);
  194. const ids = ref([]);
  195. const single = ref(true);
  196. const multiple = ref(true);
  197. const total = ref(0);
  198. const prev = ref([]);
  199. const addCompanyDialogRef = ref(null);
  200. const formOpen = ref(false);
  201. const form = ref({
  202. id: null,
  203. companyName: "",
  204. companyId: null,
  205. remark: "",
  206. type: 2,
  207. noContract: 1,
  208. });
  209. const emptyForm = {
  210. id: null,
  211. companyName: "",
  212. companyId: null,
  213. type: 2,
  214. remark: "",
  215. noContract: 1,
  216. };
  217. const { contract_verify_status } = proxy.useDict("contract_verify_status");
  218. const { contract_status } = proxy.useDict("contract_status");
  219. /** 查询对象 */
  220. const queryParams = ref({
  221. pageNum: 1,
  222. pageSize: 20,
  223. orderByColumn: "create_time",
  224. companyName: "",
  225. noContract: 1,
  226. });
  227. const editStatus = {
  228. startMonth: false,
  229. };
  230. /*********************** 方法区 ****************************/
  231. /** 查询company列表 */
  232. function getList() {
  233. loading.value = true;
  234. listWorkOrder(queryParams.value).then((response) => {
  235. orderList.value = response.rows.map((l) => ({
  236. ...l,
  237. editStatus: proxy.deepClone(editStatus),
  238. }));
  239. prev.value = proxy.deepClone(response.rows);
  240. total.value = response.total;
  241. loading.value = false;
  242. });
  243. }
  244. /** 搜索按钮操作 */
  245. function handleQuery() {
  246. queryParams.value.pageNum = 1;
  247. getList();
  248. }
  249. /** 重置按钮操作 */
  250. function resetQuery() {
  251. proxy.resetForm("queryRef");
  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.workOrderRef.open();
  263. formOpen.value = true;
  264. }
  265. function formCancel() {
  266. formOpen.value = false;
  267. reset();
  268. }
  269. function reset() {
  270. form.value = proxy.deepClone(emptyForm);
  271. }
  272. /** 修改按钮操作 */
  273. function handleUpdate(row) {
  274. // const id = row.id || ids.value;
  275. // proxy.$refs.workOrderRef.open(id);
  276. }
  277. /** 删除按钮操作 */
  278. function handleDelete(row) {
  279. const _ids = row.id || ids.value;
  280. proxy.$modal
  281. .confirm("是否确认删除选中的数据项?")
  282. .then(function () {
  283. return delWorkOrder(_ids);
  284. })
  285. .then(() => {
  286. getList();
  287. proxy.$modal.msgSuccess("删除成功!");
  288. })
  289. .catch(() => {});
  290. }
  291. /** 导出按钮操作 */
  292. function handleExport() {
  293. exportNoContract(queryParams.value);
  294. }
  295. function startDateChangeHandler(row, startDate) {
  296. if (startDate) {
  297. // console.log(startDate)
  298. row.endMonth = proxy
  299. .moment(startDate)
  300. .add(row.monthNum - 1, "M")
  301. .format("YYYY-MM-DD");
  302. } else row.endMonth = null;
  303. console.log(row);
  304. }
  305. function querySearchCompanyAsync(queryString, cb) {
  306. const query =
  307. queryString.length > 0
  308. ? {
  309. keyword: queryString,
  310. pageSize: 20,
  311. pageNum: 1,
  312. orderByColumn: "create_time",
  313. }
  314. : { pageSize: 20, pageNum: 1, orderByColumn: "create_time" };
  315. listCompany(query).then((res) => {
  316. cb(res.rows);
  317. });
  318. }
  319. function handleSelectCompany(item) {
  320. form.value.companyName = item.name;
  321. form.value.companyId = item.id;
  322. }
  323. function saveHandler() {
  324. if (form.value.companyId == null) {
  325. proxy.$modal.msgError("请选择公司");
  326. return;
  327. }
  328. if (form.value.remark == null || form.value.remark === "") {
  329. proxy.$modal.msgError("请输入备注");
  330. return;
  331. }
  332. if (form.value.id == null) {
  333. addWorkOrder(form.value).then((res) => {
  334. formCancel();
  335. getList();
  336. });
  337. }
  338. }
  339. function getTransactor(row) {
  340. if (row.entrusts != null && row.entrusts.length > 0) {
  341. const names = Array.from(new Set(row.entrusts.map((v) => v.toAccountName)));
  342. return names.join(",");
  343. } else {
  344. return row.serviceName;
  345. }
  346. }
  347. function showAddCompanyDialog() {
  348. addCompanyDialogRef.value.open();
  349. }
  350. getList();
  351. </script>