index.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <template>
  2. <el-dialog
  3. :title="isEdit ? '编辑施工队伍' : '新增施工队伍'"
  4. :visible.sync="visible"
  5. width="900px"
  6. append-to-body
  7. @close="cancel"
  8. >
  9. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  10. <el-row :gutter="20">
  11. <el-col :span="12">
  12. <el-form-item label="区县公司" prop="countyOrgNm">
  13. <el-input v-model="form.countyOrgNm" placeholder="请输入区县公司" />
  14. </el-form-item>
  15. </el-col>
  16. <el-col :span="12">
  17. <el-form-item label="队伍名称" prop="teamNm">
  18. <el-input v-model="form.teamNm" placeholder="请输入队伍名称" />
  19. </el-form-item>
  20. </el-col>
  21. </el-row>
  22. <el-row :gutter="20">
  23. <el-col :span="12">
  24. <el-form-item label="法人代表" prop="legalPerson">
  25. <el-input
  26. v-model="form.legalPerson"
  27. placeholder="请输入法人代表姓名"
  28. />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="12">
  32. <el-form-item label="法人联系电话" prop="legalContactPhone">
  33. <el-input
  34. v-model="form.legalContactPhone"
  35. placeholder="请输入法人联系电话"
  36. />
  37. </el-form-item>
  38. </el-col>
  39. </el-row>
  40. <el-row :gutter="20">
  41. <el-col :span="12">
  42. <el-form-item label="施工小组序号" prop="teamSerialNo">
  43. <el-input-number
  44. v-model="form.teamSerialNo"
  45. :min="1"
  46. controls-position="right"
  47. />
  48. </el-form-item>
  49. </el-col>
  50. <el-col :span="12">
  51. <el-form-item label="小组负责人" prop="teamLeader">
  52. <el-input
  53. v-model="form.teamLeader"
  54. placeholder="请输入小组负责人姓名"
  55. />
  56. </el-form-item>
  57. </el-col>
  58. </el-row>
  59. <el-row :gutter="20">
  60. <el-col :span="12">
  61. <el-form-item label="负责人电话" prop="teamLeaderPhone">
  62. <el-input
  63. v-model="form.teamLeaderPhone"
  64. placeholder="请输入负责人电话"
  65. />
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="12">
  69. <el-form-item label="作业车牌号" prop="construcCarNumber">
  70. <el-tag
  71. v-for="tag in form.construcCarNumber"
  72. :key="tag"
  73. closable
  74. :disable-transitions="false"
  75. @close="handleClose(tag)"
  76. style="margin-right: 10px; margin-bottom: 10px"
  77. >
  78. {{ tag }}
  79. </el-tag>
  80. <el-input
  81. v-if="inputVisible"
  82. ref="saveTagInput"
  83. v-model="inputValue"
  84. class="input-new-tag"
  85. size="small"
  86. @keyup.enter.native="handleInputConfirm"
  87. @blur="handleInputConfirm"
  88. />
  89. <el-button
  90. v-else
  91. class="button-new-tag"
  92. size="small"
  93. @click="showInput"
  94. >
  95. + 新增车牌号
  96. </el-button>
  97. </el-form-item>
  98. </el-col>
  99. </el-row>
  100. <el-row :gutter="20">
  101. <el-col :span="24">
  102. <el-form-item label="驻点位置" prop="arrestPoint">
  103. <el-input
  104. v-model="form.arrestPoint"
  105. placeholder="请输入驻点地理位置"
  106. />
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. <el-divider content-position="left">施工人员信息</el-divider>
  111. <el-table
  112. :data="form.constructorList"
  113. border
  114. style="width: 100%; margin-bottom: 20px"
  115. >
  116. <el-table-column label="人员类型" prop="constructPersonType">
  117. <template slot-scope="scope">
  118. <el-form-item
  119. :prop="'constructorList.' + scope.$index + '.constructPersonType'"
  120. :rules="{
  121. required: true,
  122. message: '请选择人员类型',
  123. trigger: 'change',
  124. }"
  125. style="margin-bottom: 0"
  126. >
  127. <el-select
  128. v-model="scope.row.constructPersonType"
  129. placeholder="请选择人员类型"
  130. style="width: 100%"
  131. >
  132. <el-option
  133. v-for="item in personTypeOptions"
  134. :key="item.value"
  135. :label="item.label"
  136. :value="item.value"
  137. />
  138. </el-select>
  139. </el-form-item>
  140. </template>
  141. </el-table-column>
  142. <el-table-column label="人员姓名" prop="constructPersonnelName">
  143. <template slot-scope="scope">
  144. <el-form-item
  145. :prop="
  146. 'constructorList.' + scope.$index + '.constructPersonnelName'
  147. "
  148. :rules="{
  149. required: true,
  150. message: '请输入人员姓名',
  151. trigger: 'blur',
  152. }"
  153. style="margin-bottom: 0"
  154. >
  155. <el-input
  156. v-model="scope.row.constructPersonnelName"
  157. placeholder="请输入人员姓名"
  158. />
  159. </el-form-item>
  160. </template>
  161. </el-table-column>
  162. <el-table-column label="联系电话" prop="constructPersonnelPhone">
  163. <template slot-scope="scope">
  164. <el-form-item
  165. :prop="
  166. 'constructorList.' + scope.$index + '.constructPersonnelPhone'
  167. "
  168. :rules="{
  169. required: true,
  170. message: '请输入联系电话',
  171. trigger: 'blur',
  172. }"
  173. style="margin-bottom: 0"
  174. >
  175. <el-input
  176. v-model="scope.row.constructPersonnelPhone"
  177. placeholder="请输入联系电话"
  178. />
  179. </el-form-item>
  180. </template>
  181. </el-table-column>
  182. <el-table-column label="操作" width="180" align="center">
  183. <template slot="header">
  184. <span>操作</span>
  185. <el-button
  186. type="primary"
  187. icon="el-icon-plus"
  188. size="mini"
  189. style="margin-left: 5px"
  190. @click="addConstructor"
  191. >
  192. </el-button>
  193. </template>
  194. <template slot-scope="scope">
  195. <el-button
  196. v-if="form.constructorList.length > 1"
  197. type="text"
  198. icon="el-icon-delete"
  199. @click="removeConstructor(scope.$index)"
  200. style="color: #f56c6c"
  201. >
  202. 删除
  203. </el-button>
  204. </template>
  205. </el-table-column>
  206. </el-table>
  207. </el-form>
  208. <div slot="footer" class="dialog-footer">
  209. <el-button @click="cancel">取 消</el-button>
  210. <el-button type="primary" :loading="loading" @click="submitForm"
  211. >确 定</el-button
  212. >
  213. </div>
  214. </el-dialog>
  215. </template>
  216. <script>
  217. import { addEditConstructTeam } from "@/api/powerdistribution/team-manage";
  218. import { personTypeOptions } from "../team.data";
  219. export default {
  220. name: "TeamManageAddEdit",
  221. data() {
  222. return {
  223. personTypeOptions,
  224. visible: false,
  225. loading: false,
  226. isEdit: false,
  227. form: {
  228. countyOrgNm: "",
  229. teamNm: "",
  230. legalPerson: "",
  231. legalContactPhone: "",
  232. teamSerialNo: 1,
  233. teamLeader: "",
  234. teamLeaderPhone: "",
  235. construcCarNumber: [],
  236. arrestPoint: "",
  237. constructorList: [
  238. {
  239. constructPersonType: "",
  240. constructPersonnelName: "",
  241. constructPersonnelPhone: "",
  242. },
  243. ],
  244. },
  245. rules: {
  246. countyOrgNm: [
  247. { required: true, message: "请输入区县公司", trigger: "blur" },
  248. ],
  249. teamNm: [
  250. { required: true, message: "请输入队伍名称", trigger: "blur" },
  251. ],
  252. legalPerson: [
  253. { required: true, message: "请输入法人代表", trigger: "blur" },
  254. ],
  255. legalContactPhone: [
  256. { required: true, message: "请输入法人联系电话", trigger: "blur" },
  257. ],
  258. teamSerialNo: [
  259. { required: true, message: "请输入施工小组序号", trigger: "blur" },
  260. ],
  261. teamLeader: [
  262. { required: true, message: "请输入小组负责人", trigger: "blur" },
  263. ],
  264. teamLeaderPhone: [
  265. { required: true, message: "请输入负责人电话", trigger: "blur" },
  266. ],
  267. construcCarNumber: [
  268. {
  269. type: "array",
  270. required: true,
  271. message: "请至少输入一个作业车牌号",
  272. trigger: "change",
  273. },
  274. ],
  275. arrestPoint: [
  276. { required: true, message: "请输入驻点位置", trigger: "blur" },
  277. ],
  278. },
  279. inputVisible: false,
  280. inputValue: "",
  281. };
  282. },
  283. methods: {
  284. init(data) {
  285. this.visible = true;
  286. if (data) {
  287. this.isEdit = true;
  288. this.form = JSON.parse(
  289. JSON.stringify({
  290. ...data,
  291. constructorList:
  292. Array.isArray(data.constructorList) &&
  293. data.constructorList.length > 0
  294. ? data.constructorList
  295. : [
  296. {
  297. constructPersonType: "",
  298. constructPersonnelName: "",
  299. constructPersonnelPhone: "",
  300. },
  301. ],
  302. })
  303. );
  304. } else {
  305. this.isEdit = false;
  306. this.reset();
  307. }
  308. },
  309. reset() {
  310. this.$refs.form?.resetFields();
  311. if (!this.isEdit) {
  312. this.form = {
  313. countyOrgNm: "",
  314. teamNm: "",
  315. legalPerson: "",
  316. legalContactPhone: "",
  317. teamSerialNo: 1,
  318. teamLeader: "",
  319. teamLeaderPhone: "",
  320. construcCarNumber: [],
  321. arrestPoint: "",
  322. constructorList: [
  323. {
  324. constructPersonType: "",
  325. constructPersonnelName: "",
  326. constructPersonnelPhone: "",
  327. },
  328. ],
  329. };
  330. }
  331. },
  332. addConstructor() {
  333. this.form.constructorList.push({
  334. constructPersonType: "",
  335. constructPersonnelName: "",
  336. constructPersonnelPhone: "",
  337. });
  338. },
  339. removeConstructor(index) {
  340. this.form.constructorList.splice(index, 1);
  341. },
  342. submitForm() {
  343. this.$refs.form.validate(async (valid) => {
  344. if (valid) {
  345. try {
  346. this.loading = true;
  347. const submitData = {
  348. ...this.form,
  349. };
  350. await addEditConstructTeam(submitData);
  351. this.$modal.msgSuccess(this.isEdit ? "修改成功" : "新增成功");
  352. this.$emit("success");
  353. this.visible = false;
  354. } catch (error) {
  355. console.error(error);
  356. } finally {
  357. this.loading = false;
  358. }
  359. }
  360. });
  361. },
  362. cancel() {
  363. this.visible = false;
  364. this.reset();
  365. },
  366. handleClose(tag) {
  367. const index = this.form.construcCarNumber.indexOf(tag);
  368. if (index > -1) {
  369. this.form.construcCarNumber.splice(index, 1);
  370. }
  371. },
  372. showInput() {
  373. this.inputVisible = true;
  374. this.$nextTick(() => {
  375. this.$refs.saveTagInput.$refs.input.focus();
  376. });
  377. },
  378. handleInputConfirm() {
  379. let inputValue = this.inputValue;
  380. if (inputValue) {
  381. const carNumReg =
  382. /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$/;
  383. if (!carNumReg.test(inputValue)) {
  384. this.$message.warning("请输入正确的车牌号格式");
  385. return;
  386. }
  387. if (this.form.construcCarNumber.includes(inputValue)) {
  388. this.$message.warning("该车牌号已存在");
  389. return;
  390. }
  391. this.form.construcCarNumber.push(inputValue);
  392. }
  393. this.inputVisible = false;
  394. this.inputValue = "";
  395. },
  396. },
  397. };
  398. </script>
  399. <style lang="scss" scoped>
  400. .constructor-item {
  401. position: relative;
  402. padding: 20px;
  403. padding-bottom: 0;
  404. border: 1px dashed #dcdfe6;
  405. margin-bottom: 10px;
  406. border-radius: 4px;
  407. .delete-btn {
  408. position: absolute;
  409. right: 10px;
  410. top: 10px;
  411. }
  412. }
  413. .text-center {
  414. text-align: center;
  415. margin: 20px 0;
  416. }
  417. ::v-deep .el-input-number {
  418. width: 100%;
  419. }
  420. .el-tag + .el-tag {
  421. margin-left: 10px;
  422. }
  423. .button-new-tag {
  424. margin-left: 10px;
  425. height: 32px;
  426. line-height: 30px;
  427. padding-top: 0;
  428. padding-bottom: 0;
  429. }
  430. .input-new-tag {
  431. width: 90px;
  432. margin-left: 10px;
  433. vertical-align: bottom;
  434. }
  435. // 标签容器样式
  436. .el-form-item ::v-deep .el-form-item__content {
  437. // border: 1px solid #dcdfe6;
  438. border-radius: 4px;
  439. min-height: 40px;
  440. padding: 5px;
  441. display: flex;
  442. flex-wrap: wrap;
  443. align-items: center;
  444. &:hover {
  445. border-color: #c0c4cc;
  446. }
  447. .el-tag {
  448. margin: 2px 5px;
  449. }
  450. }
  451. // 添加表格相关样式
  452. ::v-deep {
  453. .el-table {
  454. .el-form-item {
  455. margin-bottom: 0;
  456. .el-form-item__content {
  457. margin-left: 0 !important;
  458. }
  459. .el-form-item__error {
  460. position: absolute;
  461. top: 100%;
  462. z-index: 1;
  463. }
  464. }
  465. .el-table__cell {
  466. padding: 5px;
  467. }
  468. // 添加下拉框样式调整
  469. .el-select {
  470. width: 100%;
  471. .el-input__inner {
  472. // border: none;
  473. padding-left: 8px;
  474. }
  475. }
  476. // 添加表头按钮样式
  477. .el-table__header-wrapper {
  478. .el-button--mini {
  479. padding: 5px 8px;
  480. }
  481. }
  482. }
  483. }
  484. </style>