add.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. <template>
  2. <div class="app-container addPlan">
  3. <div>
  4. <div
  5. style="
  6. font-size: 16rem;
  7. font-weight: 1000;
  8. text-align: left;
  9. color: #333333;position: relative;
  10. background: #fff;
  11. "
  12. >
  13. {{ name }}
  14. <el-button size="small" type="primary" plain style="position: absolute;top:0;right: 10px" @click="cancle">返回</el-button>
  15. </div>
  16. <el-form
  17. ref="form"
  18. :model="form"
  19. :rules="rules"
  20. label-width="200rem"
  21. style="padding-left: 10%; padding-right: 100rem; margin-top: 50rem"
  22. >
  23. <el-row>
  24. <el-col :span="12">
  25. <el-form-item label="选择计划" prop="planId">
  26. <el-select
  27. v-model="form.planId"
  28. placeholder="请选择施工计划"
  29. clearable
  30. size="small"
  31. style="width: 300rem"
  32. :disabled="readonly"
  33. @change="planChange()"
  34. >
  35. <el-option
  36. v-for="obj in planList"
  37. :key="obj.id"
  38. :label="obj.name"
  39. :value="obj.id"
  40. />
  41. </el-select>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="12">
  45. <el-form-item label="施工路段" prop="section" >
  46. <el-select
  47. v-model="form.section"
  48. placeholder="请选择路段"
  49. clearable
  50. size="small"
  51. :disabled="readonly"
  52. style="width: 300rem"
  53. >
  54. <el-option
  55. v-for="dict in dict.type.road"
  56. :key="dict.value"
  57. :label="dict.value"
  58. :value="dict.value"
  59. />
  60. </el-select>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="12">
  64. <el-form-item label="方向" prop="direction">
  65. <el-select
  66. v-model="form.direction"
  67. placeholder="请选择方向"
  68. clearable
  69. :disabled="readonly"
  70. size="small"
  71. >
  72. <el-option
  73. v-for="dict in dict.type.sys_direction"
  74. :key="dict.value"
  75. :label="dict.label"
  76. :value="dict.value"
  77. />
  78. </el-select>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="12">
  82. <el-row >
  83. <el-col :span="7">
  84. <el-form-item label="开始公里桩" prop="startKm">
  85. <el-input
  86. v-model="form.startKm"
  87. placeholder="请输入开始公里桩"
  88. style="width: 300rem"
  89. :readonly="readonly"
  90. >
  91. <template slot="prepend">K</template>
  92. </el-input>
  93. </el-form-item>
  94. </el-col>
  95. <el-col :span="6">
  96. <el-form-item label="" prop="startHectometer">
  97. <el-input
  98. v-model="form.startHectometer"
  99. placeholder="请输入开始米桩"
  100. style="width: 300rem"
  101. :readonly="readonly"
  102. >
  103. <template slot="prepend">+</template>
  104. </el-input>
  105. </el-form-item>
  106. </el-col>
  107. </el-row>
  108. </el-col>
  109. <el-col :span="24">
  110. <el-row>
  111. <el-col :span="12">
  112. <el-form-item label="占用车道" prop="lane">
  113. <el-select
  114. multiple
  115. v-model="roadlan"
  116. placeholder="请选择方向"
  117. clearable
  118. :disabled="readonly"
  119. size="small"
  120. style="width: 300rem"
  121. >
  122. <el-option
  123. v-for="i in ['1','2','3', '4']"
  124. :key="i"
  125. :label="i"
  126. :value="i"
  127. />
  128. </el-select>
  129. <!-- <el-input v-model="form.lane" placeholder="请输入占用车道" style="width:300rem"/> -->
  130. </el-form-item>
  131. </el-col>
  132. <el-col :span="12">
  133. <el-row >
  134. <el-col :span="7">
  135. <el-form-item label="结束公里桩" prop="endKm">
  136. <el-input
  137. v-model="form.endKm"
  138. :readonly="readonly"
  139. placeholder="请输入结束公里桩"
  140. style="width: 300rem"
  141. >
  142. <template slot="prepend">K</template>
  143. </el-input>
  144. </el-form-item>
  145. </el-col>
  146. <el-col :span="6">
  147. <el-form-item label="" prop="endHectometer">
  148. <el-input
  149. v-model="form.endHectometer"
  150. :readonly="readonly"
  151. placeholder="请输入结束米桩"
  152. style="width: 300rem"
  153. >
  154. <template slot="prepend">+</template>
  155. </el-input>
  156. </el-form-item>
  157. <span v-if="showlengthover" style="color:red;position: absolute;bottom:0;left: 12vw;width:200px">{{showlenfthmsg}}</span>
  158. </el-col>
  159. </el-row>
  160. </el-col>
  161. </el-row>
  162. </el-col>
  163. <el-col :span="12">
  164. <el-form-item label="施工内容一" prop="contentOne">
  165. <el-select
  166. v-model="form.contentOne"
  167. placeholder="请选择方向"
  168. clearable
  169. :disabled="readonly"
  170. size="small"
  171. style="width: 300rem"
  172. >
  173. <el-option
  174. v-for="dict in dict.type.content_one"
  175. :key="dict.value"
  176. :label="dict.label"
  177. :value="dict.value"
  178. />
  179. </el-select>
  180. </el-form-item>
  181. </el-col>
  182. <el-col :span="12">
  183. <el-form-item label="预计开始时间" prop="startTime">
  184. <!-- <el-date-picker clearable
  185. v-model="form.startTime"
  186. type="date"
  187. value-format="yyyy-MM-dd"
  188. placeholder="请选择预计开始时间">
  189. </el-date-picker> -->
  190. <el-date-picker
  191. style="width: 300rem"
  192. v-model="form.startTime"
  193. value-format="yyyy-MM-dd HH:mm:dd"
  194. type="datetime"
  195. :readonly="readonly"
  196. placeholder="选择日期时间"
  197. >
  198. </el-date-picker>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="12">
  202. <el-form-item label="施工内容二" prop="contentTwo">
  203. <el-select
  204. v-model="form.contentTwo"
  205. placeholder="请选择方向"
  206. clearable
  207. :disabled="readonly"
  208. size="small"
  209. style="width: 300rem"
  210. >
  211. <el-option
  212. v-for="dict in dict.type.content_two"
  213. :key="dict.value"
  214. :label="dict.label"
  215. :value="dict.value"
  216. />
  217. </el-select>
  218. </el-form-item>
  219. </el-col>
  220. <el-col :span="12">
  221. <el-form-item label="预计结束时间" prop="endTime">
  222. <el-date-picker
  223. clearable
  224. style="width: 300rem"
  225. v-model="form.endTime"
  226. :readonly="readonly"
  227. value-format="yyyy-MM-dd HH:mm:dd"
  228. type="datetime"
  229. placeholder="请选择预计结束时间"
  230. >
  231. </el-date-picker>
  232. </el-form-item>
  233. </el-col>
  234. <el-col :span="12">
  235. <el-form-item label="现场负责人" prop="manageUser">
  236. <el-input
  237. :readonly="readonly"
  238. v-model="form.manageUser"
  239. placeholder="请输入现场负责人"
  240. />
  241. </el-form-item>
  242. </el-col>
  243. <el-col :span="12">
  244. <el-form-item label="现场安全员" prop="saveUser">
  245. <el-input
  246. :readonly="readonly"
  247. v-model="form.saveUser"
  248. placeholder="请输入现场安全员"
  249. />
  250. </el-form-item>
  251. </el-col>
  252. <el-col :span="12">
  253. <el-form-item label="现场负责人手机号" prop="managePhone">
  254. <el-input
  255. type="textarea"
  256. :readonly="readonly"
  257. v-model="form.managePhone"
  258. placeholder="请输入现场负责人手机号"
  259. />
  260. </el-form-item>
  261. </el-col>
  262. <el-col :span="12">
  263. <el-form-item label="安全员手机号" prop="savePhone">
  264. <el-input
  265. type="textarea"
  266. :readonly="readonly"
  267. v-model="form.savePhone"
  268. placeholder="请输入安全员手机号"
  269. />
  270. </el-form-item>
  271. </el-col>
  272. <el-col :span="24">
  273. <el-form-item label="施工内容描述" prop="contentDes">
  274. <el-input type="textarea" :readonly="readonly" v-model="form['contentDes']"></el-input>
  275. </el-form-item>
  276. </el-col>
  277. </el-row>
  278. <div >
  279. <el-form-item label="审批流程" >
  280. <div style="padding-top: 10px">
  281. <el-timeline :reverse="true">
  282. <el-timeline-item
  283. v-for="(activity, index) in activities"
  284. :key="index"
  285. :timestamp="activity.timestamp">
  286. {{activity.deptname + " "+activity.content}}
  287. </el-timeline-item>
  288. </el-timeline>
  289. </div>
  290. </el-form-item>
  291. </div>
  292. </el-form>
  293. <div style="text-align: center">
  294. <el-button size="mini" type="primary" v-if="!readonly" @click="save(1)">保存</el-button>
  295. <el-button size="mini" type="success" v-if="!readonly" @click="dialogVisible = true">提交</el-button>
  296. <el-button size="mini" v-if="!readonly" @click="cancle">取消</el-button>
  297. </div>
  298. </div>
  299. <el-dialog
  300. title="选择部门"
  301. :visible.sync="dialogVisible"
  302. append-to-body
  303. width="20%"
  304. style="margin-top: 20vh"
  305. >
  306. <div>
  307. <el-row>
  308. <el-col
  309. :span="12"
  310. v-for="item in deptlist.filter(i=>{
  311. for (const iKey in spl) {
  312. if (spl[iKey][0]+'' == i.deptId+''){return true;}
  313. }
  314. return false;
  315. })" v-bind:key="item.deptId"
  316. style="margin-bottom: 10px"
  317. >
  318. <el-radio v-model="audioDept" :label="item.deptId">{{
  319. item.deptName
  320. }}</el-radio>
  321. </el-col>
  322. </el-row>
  323. </div>
  324. <span slot="footer" class="dialog-footer">
  325. <el-button @click="dialogVisible = false">取 消</el-button>
  326. <el-button type="primary" @click="save(2)">确 定</el-button>
  327. </span>
  328. </el-dialog>
  329. </div>
  330. </template>
  331. <script>
  332. import {
  333. listReport,
  334. getReport,
  335. delReport,
  336. addReport,
  337. updateReport,
  338. } from "@/api/system/report";
  339. import {
  340. listPlan,
  341. getPlan,
  342. delPlan,
  343. addPlan,
  344. updatePlan,
  345. } from "@/api/system/plan";
  346. import {
  347. listDept,
  348. getDept,
  349. delDept,
  350. addDept,
  351. updateDept,
  352. listDeptExcludeChild,
  353. } from "@/api/system/dept";
  354. import {
  355. listConfig,
  356. getConfig,
  357. delConfig,
  358. addConfig,
  359. updateConfig,
  360. refreshCache,
  361. getConfigKey
  362. } from "@/api/system/config";
  363. import { cloneDeep } from "lodash";
  364. import moment from "moment";
  365. import router from "@/router";
  366. // import { AppMain } from '@/layout/components'
  367. export default {
  368. name: "Index",
  369. dicts: ["sys_direction", "content_one", "content_two","road"],
  370. // components: {
  371. // AppMain,
  372. // },
  373. data() {
  374. return {
  375. // 版本号
  376. version: "3.8.2",
  377. // 表单参数
  378. form: {},
  379. activities:[{content: '报备创建',
  380. timestamp: '2018-04-15'}],
  381. rules: {},
  382. planList: [],
  383. status: "",
  384. name: "",
  385. dialogVisible: false,
  386. audioDept: "103",
  387. deptlist: [],
  388. roadlan:[],
  389. showlengthover:false,
  390. showlenfthmsg:"总长不得超过2.5公里",
  391. readonly:false,
  392. nexdept:null,
  393. alldept:[],
  394. spl:[],
  395. };
  396. },
  397. watch: {
  398. 'roadlan': {
  399. handler(oldValue, newVal) {
  400. var cpc =cloneDeep(oldValue);
  401. this.form["lane"] = cpc.sort().join(",");
  402. }
  403. },
  404. form: {
  405. handler(oldValue, newVal) {
  406. var len = (getobjdata(newVal.endKm)+(getobjdata(newVal.endHectometer)/1000)) - (getobjdata(newVal.startKm)+(getobjdata(newVal.startHectometer)/1000));
  407. if(len>2.5){
  408. this.showlenfthmsg = '总长不得超过2.5公里';
  409. this.showlengthover = true;
  410. }else{
  411. if(len<0){
  412. this.showlenfthmsg = '起始桩不得大于终止桩';
  413. this.showlengthover = true;
  414. }else{
  415. this.showlengthover = false;
  416. }
  417. }
  418. },
  419. deep: true // 深度监听
  420. }
  421. },
  422. mounted: function () {
  423. this.getList();
  424. var queryd = localStorage.getItem("currentreport");
  425. if(queryd){
  426. queryd = JSON.parse(queryd);
  427. }else{
  428. this.$modal.msgError("发生错误");
  429. this.$router.back();
  430. return;
  431. }
  432. console.log(queryd);
  433. this.$route.query.params = null;
  434. this.form = queryd;
  435. this.name = queryd.routerName;
  436. if(this.form.planId){
  437. this.form.planId= parseInt(this.form.planId);
  438. }
  439. this.activities = JSON.parse(queryd.ext1 ?? "[]") ?? [];
  440. //根据时间排序
  441. this.activities = this.activities.sort((a, b)=>{ return moment(a.timestamp).unix()-moment(b.timestamp).unix()})
  442. if(queryd.status==undefined || queryd.status==null || queryd.status==""){
  443. queryd.status="1";
  444. }
  445. if(this.name === '详情' || queryd.status!=="1" ){
  446. this.readonly = true;
  447. }else{
  448. this.readonly=false;
  449. }
  450. if(this.name === '修改'&& queryd.status=="4"){
  451. this.readonly=false;
  452. }
  453. this.form.lane = queryd.lane;
  454. this.roadlan = this.form.lane?this.form.lane.split(","):[]
  455. // console.log(this.roadlan)
  456. listDept({ parentId: 101 }).then((res) => {
  457. // console.log(res)
  458. this.deptlist = res.data;
  459. });
  460. listDept({}).then(res=>{
  461. this.alldept = res.data;
  462. });
  463. getConfigKey("spflow").then(res=>{
  464. res = JSON.parse(res.msg);
  465. this.spl = res;
  466. })
  467. // console.log(this.$route.query.status);
  468. },
  469. methods: {
  470. planChange() {
  471. for (var index in this.planList) {
  472. if (this.planList[index].id == this.form.planId) {
  473. this.form = {...cloneDeep(this.planList[index])};
  474. this.form.planId = this.planList[index].id;
  475. delete this.form.id;
  476. this.form.startTime +=" 00:00:00";
  477. this.form.endTime +=" 00:00:00";
  478. this.form.ext1 = this.planList[index].ext1;
  479. // this.form.section = this.planList[index].section;
  480. // this.form.direction = this.planList[index].direction;
  481. // this.form.startKm = this.planList[index].startKm;
  482. // this.form.startHectometer = this.planList[index].startHectometer;
  483. // this.form.endKm = this.planList[index].endKm;
  484. // this.form.endHectometer = this.planList[index].endHectometer;
  485. // this.form.contentOne = this.planList[index].contentOne;
  486. // this.form.contentTwo = this.planList[index].contentTwo;
  487. }
  488. }
  489. },
  490. getList() {
  491. listPlan().then((response) => {
  492. this.planList = response.rows;
  493. console.log(this.planList);
  494. });
  495. },
  496. goTarget(href) {
  497. window.open(href, "_blank");
  498. },
  499. save(status) {
  500. this.form.status = status;
  501. if (status == 2) {
  502. this.form.auditDept = this.audioDept;
  503. // this.form.ext1 = JSON.parse(this.form.ext1==undefined?"[]":this.form.ext1) ?? [];
  504. // var timedate = moment().format("YYYY-MM-DD HH:mm:ss");
  505. // this.form.ext1.push({"content": "提交审核", "deptname": this.$store.state.user.dept.deptName, "timestamp": timedate})
  506. // this.form.ext1 = JSON.stringify(this.form.ext1);
  507. }
  508. this.$refs["form"].validate((valid) => {
  509. if (valid) {
  510. if (this.form.id != null) {
  511. console.log(this.form)
  512. updateReport(this.form).then((response) => {
  513. this.$modal.msgSuccess("修改成功");
  514. this.$router.push({ path: "/report" });
  515. });
  516. } else {
  517. addReport(this.form).then((response) => {
  518. console.log(this.response);
  519. this.$modal.msgSuccess("新增成功");
  520. this.$router.push({ path: "/report" });
  521. });
  522. }
  523. }
  524. });
  525. },
  526. cancle() {
  527. this.$router.push({ path: "/report" });
  528. },
  529. submit() {
  530. this.dialogVisible = true;
  531. },
  532. },
  533. };
  534. function getobjdata(val){
  535. return val?parseInt(val):0;
  536. }
  537. </script>
  538. <style scoped lang="scss">
  539. .addPlan {
  540. background-color: #ffffff;
  541. overflow-y: auto;
  542. }
  543. </style>