workOrder-detail.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. <template>
  2. <el-dialog
  3. :visible.sync="showDialog"
  4. :title="title"
  5. :modal-append-to-body="false"
  6. style="text-align: left;"
  7. @close="closeDialog"
  8. :close-on-click-modal="false"
  9. width="1500px"
  10. >
  11. <div class="user-panel" v-loading="loading">
  12. <el-form
  13. ref="form"
  14. :model="formModel"
  15. :rules="ruleValidate"
  16. :label-width="'100px'"
  17. :inline="true"
  18. >
  19. <el-form-item label="工单号" prop="number">
  20. <el-input v-model="formModel.number" placeholder="请输入真实姓名" style="width: 300px"></el-input>
  21. </el-form-item>
  22. <el-form-item label="标题" prop="title">
  23. <el-input v-model="formModel.title" placeholder="请输入联系电话" style="width: 300px"></el-input>
  24. </el-form-item>
  25. <el-form-item label="地址" prop="address">
  26. <el-input v-model="formModel.address" placeholder="请输入身份证号" style="width: 300px"></el-input>
  27. </el-form-item>
  28. <el-form-item label="日期" prop="date">
  29. <el-input v-model="formModel.date" placeholder="请输入所在地区" style="width: 300px"></el-input>
  30. </el-form-item>
  31. <el-form-item label="报价" prop="price">
  32. <el-input v-model="formModel.price" placeholder="请输入报价" style="width: 300px"></el-input>
  33. </el-form-item>
  34. <el-form-item label="支付状态" prop="payStatus">
  35. <el-select v-model="formModel.payStatus" placeholder="请选择" style="width: 300px">
  36. <el-option
  37. v-for="item in paystatusList"
  38. :key="item.value"
  39. :label="item.name"
  40. :value="item.value">
  41. </el-option>
  42. </el-select>
  43. </el-form-item>
  44. </el-form>
  45. </div>
  46. <div>
  47. <el-tabs v-model="activeName" type="card">
  48. <el-tab-pane label="工单信息" name="first">
  49. <el-card class="box-card">
  50. <div slot="header" class="clearfix">
  51. <span>工单信息</span>
  52. </div>
  53. <div>
  54. <el-form
  55. ref="form"
  56. :model="formModel2"
  57. :rules="ruleValidate"
  58. :label-width="'150px'"
  59. :inline="true"
  60. >
  61. <el-form-item label="所在地" prop="address">
  62. <el-input v-model="formModel2.address" placeholder="请输入所在地" style="width: 300px"></el-input>
  63. </el-form-item>
  64. <el-form-item label="施工位置" prop="location">
  65. <el-select v-model="formModel2.location" placeholder="请选择" style="width: 300px">
  66. <el-option
  67. v-for="item in locationList"
  68. :key="item.value"
  69. :label="item.name"
  70. :value="item.value">
  71. </el-option>
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item label="施工环境" prop="environment">
  75. <el-select v-model="formModel2.environment" placeholder="请选择" style="width: 300px">
  76. <el-option
  77. v-for="item in environmentList"
  78. :key="item.value"
  79. :label="item.name"
  80. :value="item.value">
  81. </el-option>
  82. </el-select>
  83. </el-form-item>
  84. <el-form-item label="水箱材质" prop="material">
  85. <el-select v-model="formModel2.material" placeholder="请选择" style="width: 300px">
  86. <el-option
  87. v-for="item in materialList"
  88. :key="item.value"
  89. :label="item.name"
  90. :value="item.value">
  91. </el-option>
  92. </el-select>
  93. </el-form-item>
  94. <el-form-item label="水箱体积" prop="volume">
  95. <el-input v-model="formModel2.volume" placeholder="请输入所在地" style="width: 300px">
  96. <template slot="append">m³</template>
  97. </el-input>
  98. </el-form-item>
  99. <el-form-item label="异型水箱补贴" prop="amount">
  100. <el-input v-model="formModel2.amount" placeholder="请输入所在地" style="width: 300px">
  101. <template slot="append">元</template>
  102. </el-input>
  103. </el-form-item>
  104. <el-form-item label="施工难度" prop="difficulty">
  105. <el-select v-model="formModel2.difficulty" placeholder="请选择" style="width: 300px">
  106. <el-option
  107. v-for="item in difficultyList"
  108. :key="item.value"
  109. :label="item.name"
  110. :value="item.value">
  111. </el-option>
  112. </el-select>
  113. </el-form-item>
  114. <el-form-item label="额外补助" prop="subsidyType">
  115. <el-input v-model="formModel2.subsidyType" placeholder="请输入所在地" style="width: 300px"></el-input>
  116. </el-form-item>
  117. <el-form-item label="补贴金额" prop="subsidyAmount">
  118. <el-input v-model="formModel2.subsidyAmount" placeholder="请输入所在地" style="width: 300px">
  119. <template slot="append">元</template>
  120. </el-input>
  121. </el-form-item>
  122. <el-form-item label="工程总预算" prop="budget">
  123. <el-input v-model="formModel2.budget" placeholder="请输入所在地" style="width: 300px">
  124. <template slot="append">元</template>
  125. </el-input>
  126. </el-form-item>
  127. <el-form-item label="工期要求" prop="period">
  128. <el-input v-model="formModel2.period" placeholder="请输入所在地" style="width: 300px">
  129. <template slot="append">月</template>
  130. </el-input>
  131. </el-form-item>
  132. <el-form-item label="通过后打款比例" prop="completionPayProp">
  133. <el-input v-model="formModel2.completionPayProp" placeholder="请输入所在地" style="width: 300px">
  134. <template slot="append">%</template>
  135. </el-input>
  136. </el-form-item>
  137. <el-form-item label="驻地条件要求" prop="requirement">
  138. <el-input v-model="formModel2.requirement" placeholder="请输入所在地" style="width: 300px"></el-input>
  139. </el-form-item>
  140. <el-form-item label="施工阶段要求" prop="stageRequirements">
  141. <el-input v-model="formModel2.stageRequirements" placeholder="请输入所在地" style="width: 300px"></el-input>
  142. </el-form-item>
  143. <el-form-item label="验收标准" prop="acceptanceCriteria">
  144. <el-input v-model="formModel2.acceptanceCriteria" placeholder="请输入所在地" style="width: 300px"></el-input>
  145. </el-form-item>
  146. <el-form-item label="售后要求" prop="salesRequirement">
  147. <el-input v-model="formModel2.salesRequirement" placeholder="请输入所在地" style="width: 300px"></el-input>
  148. </el-form-item>
  149. </el-form>
  150. </div>
  151. </el-card>
  152. <el-card class="box-card">
  153. <div slot="header" class="clearfix">
  154. <span>接单要求</span>
  155. </div>
  156. <div>
  157. <el-form
  158. ref="form"
  159. :model="formModel3"
  160. :rules="ruleValidate"
  161. :label-width="'250px'"
  162. :inline="true"
  163. >
  164. <el-form-item label="保证金" prop="amount">
  165. <el-input v-model="formModel3.amount" placeholder="请输入所在地" style="width: 300px">
  166. <template slot="append">元</template>
  167. </el-input>
  168. </el-form-item>
  169. <el-form-item label="师傅完成工单量" prop="completedNum">
  170. <el-input v-model="formModel3.completedNum" style="width: 300px">
  171. <template slot="append">单</template>
  172. </el-input>
  173. </el-form-item>
  174. <el-form-item label="订单发布模式" prop="orderModel">
  175. <el-select v-model="formModel3.orderModel" placeholder="请选择" style="width: 300px">
  176. <el-option
  177. v-for="item in orderModelList"
  178. :key="item.value"
  179. :label="item.name"
  180. :value="item.value">
  181. </el-option>
  182. </el-select>
  183. </el-form-item>
  184. <el-form-item label="是否要求师傅具有施工资质" prop="isQualification">
  185. <el-switch
  186. style="width: 300px"
  187. v-model="formModel3.isQualification">
  188. </el-switch>
  189. </el-form-item>
  190. <el-form-item label="是否要求师傅上传购买保险凭证" prop="isInsuranceCertificate">
  191. <el-switch
  192. style="width: 300px"
  193. v-model="formModel3.isInsuranceCertificate">
  194. </el-switch>
  195. </el-form-item>
  196. </el-form>
  197. </div>
  198. </el-card>
  199. <el-card class="box-card">
  200. <div slot="header" class="clearfix">
  201. <span>客户信息</span>
  202. </div>
  203. <div>
  204. <el-form
  205. ref="form"
  206. :model="formModel4"
  207. :rules="ruleValidate"
  208. :label-width="'150px'"
  209. :inline="true"
  210. >
  211. <el-form-item label="客户名称">
  212. <el-input v-model="formModel4.customerName" placeholder="请输入所在地" style="width: 300px"></el-input>
  213. </el-form-item>
  214. <el-form-item label="联系方式" prop="phone">
  215. <el-input v-model="formModel4.customerPhone" placeholder="请输入所在地" style="width: 300px"></el-input>
  216. </el-form-item>
  217. </el-form>
  218. </div>
  219. </el-card>
  220. <el-card class="box-card">
  221. <div slot="header" class="clearfix">
  222. <span>订单信息</span>
  223. </div>
  224. <div>
  225. <el-form
  226. ref="form"
  227. :model="formModel5"
  228. :rules="ruleValidate"
  229. :label-width="'150px'"
  230. :inline="true"
  231. >
  232. <el-form-item label="订单状态" prop="status">
  233. <el-select v-model="formModel.status" placeholder="请选择订单状态" style="width: 300px">
  234. <el-option
  235. v-for="item in orderStatusList"
  236. :key="item.value"
  237. :label="item.name"
  238. :value="item.value">
  239. </el-option>
  240. </el-select>
  241. </el-form-item>
  242. <el-form-item label="订单编号" prop="number">
  243. <el-input v-model="formModel.number" placeholder="请输入订单编号" style="width: 300px"></el-input>
  244. </el-form-item>
  245. <el-form-item label="发布时间" prop="createTime">
  246. <el-input v-model="formModel.createTime" placeholder="请输入发布时间" style="width: 300px"></el-input>
  247. </el-form-item>
  248. </el-form>
  249. </div>
  250. </el-card>
  251. </el-tab-pane>
  252. <el-tab-pane label="现场照片" name="second">
  253. <div>
  254. <el-image v-for="(item,index) in imageList" :key="index"
  255. class="img"
  256. src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
  257. fit="fit"></el-image>
  258. </div>
  259. </el-tab-pane>
  260. <el-tab-pane label="师傅信息" name="third">
  261. <div style="margin:30px">
  262. <el-descriptions v-if="technicianInfo!=null">
  263. <el-descriptions-item label="姓名">{{technicianInfo.realName}}</el-descriptions-item>
  264. <el-descriptions-item label="星级">4.6分</el-descriptions-item>
  265. <el-descriptions-item label="已完成单数">50单</el-descriptions-item>
  266. <el-descriptions-item label="好评率">80%</el-descriptions-item>
  267. <el-descriptions-item label="擅长类目">家具灯具厨卫健身器材</el-descriptions-item>
  268. <el-descriptions-item label="师傅来源">4.6分</el-descriptions-item>
  269. <el-descriptions-item label="所在地区">50单</el-descriptions-item>
  270. <el-descriptions-item label="公司性质">80%</el-descriptions-item>
  271. <el-descriptions-item label="公司地址">家具灯具厨卫健身器材</el-descriptions-item>
  272. <el-descriptions-item label="联系电话">4.6分</el-descriptions-item>
  273. <el-descriptions-item label="服务介绍">50单</el-descriptions-item>
  274. </el-descriptions>
  275. </div>
  276. </el-tab-pane>
  277. <el-tab-pane label="施工进度" name="fourth">
  278. <div style="margin:50px">
  279. <el-timeline >
  280. <el-timeline-item :timestamp="item.submitDate" placement="top" v-for="(item,index) in constructionProgressList" :key="index">
  281. <h4>{{item.submitByN}} {{item.title}}</h4>
  282. <div>
  283. <el-image v-for="(item1,index1) in item.imageList" :key="index1"
  284. class="img"
  285. style="width:50px;height:50px"
  286. :src="item1"
  287. fit="fit"></el-image>
  288. </div>
  289. <p>{{item.submitByN}} 提交于 {{item.submitTime}}</p>
  290. </el-timeline-item>
  291. </el-timeline>
  292. </div>
  293. </el-tab-pane>
  294. <el-tab-pane label="客户评价" name="five">
  295. <el-table
  296. :data="tableData"
  297. style="width: 100%">
  298. <el-table-column
  299. prop="companyName"
  300. label="评论人"
  301. width="180">
  302. </el-table-column>
  303. <el-table-column prop="starRating" label="星级" >
  304. <template slot-scope="{row}">
  305. <el-rate v-model="row.starRating" disabled ></el-rate>
  306. </template>
  307. </el-table-column>
  308. <el-table-column
  309. prop="content"
  310. label="评论内容" width="400">
  311. </el-table-column>
  312. <el-table-column prop="address" label="评论图片">
  313. <template slot-scope="{row}">
  314. <span>
  315. <el-image
  316. class="img"
  317. style="width: 50px; height: 50px"
  318. :src="row.image"
  319. fit="fit"></el-image>
  320. </span>
  321. </template>
  322. </el-table-column>
  323. <el-table-column
  324. prop="createTime"
  325. label="评论时间">
  326. </el-table-column>
  327. </el-table>
  328. </el-tab-pane>
  329. </el-tabs>
  330. </div>
  331. <span slot="footer" class="dialog-footer">
  332. <el-button @click="closeDialog">取 消</el-button>
  333. <!-- <el-button type="primary" @click="handleSubmit" :loading="submitting"
  334. >确 定</el-button
  335. > -->
  336. </span>
  337. </el-dialog>
  338. </template>
  339. <script>
  340. import Constant from "@/constant";
  341. import { getToken } from "@/utils/auth"; // get token from cookie
  342. import workOrderApi from "@/api/base/workOrder";
  343. import dataDictionaryApi from "@/api/sys/dataDictionary";
  344. export default {
  345. props: ["businessKey", "title"],
  346. data() {
  347. return {
  348. showPwd: true,
  349. ruleValidate: {
  350. },
  351. roleList: [],
  352. formModel: {},
  353. formModel2:{},
  354. formModel3:{},
  355. formModel4:{},
  356. formModel5:{},
  357. tableData:[],
  358. showDialog: true,
  359. loading: false,
  360. submitting: false,
  361. enterpriseList:[],
  362. //上传地址
  363. uploadUrl: Constant.serverUrl + "/uploadPicture",
  364. uploadData: {
  365. subFolder: "water-tank",
  366. },
  367. fileUrl: "",
  368. headers: {
  369. Authorization: getToken(),
  370. },
  371. activeName: 'first',
  372. paystatusList:[],
  373. orderStatusList:[],
  374. orderModelList:[],
  375. technicianInfo:{},
  376. imageList:[],
  377. constructionProgressList:[],
  378. reverse: true,
  379. locationList:[],
  380. environmentList:[],
  381. materialList:[],
  382. difficultyList:[],
  383. };
  384. },
  385. created() {
  386. var self = this;
  387. dataDictionaryApi.findByCatalogName({
  388. catalogName: "支付状态",
  389. })
  390. .then((response) => {
  391. var jsonData = response.data;
  392. self.paystatusList = jsonData.data;
  393. });
  394. dataDictionaryApi.findByCatalogName({
  395. catalogName: "工单状态",
  396. })
  397. .then((response) => {
  398. var jsonData = response.data;
  399. self.orderStatusList = jsonData.data;
  400. //alert(JSON.stringify(self.orderStatusList))
  401. });
  402. dataDictionaryApi.findByCatalogName({
  403. catalogName: "订单发布模式",
  404. })
  405. .then((response) => {
  406. var jsonData = response.data;
  407. self.orderModelList = jsonData.data;
  408. });
  409. dataDictionaryApi.findByCatalogName({
  410. catalogName: "施工位置",
  411. })
  412. .then((response) => {
  413. var jsonData = response.data;
  414. self.locationList = jsonData.data;
  415. });
  416. dataDictionaryApi.findByCatalogName({
  417. catalogName: "施工环境",
  418. })
  419. .then((response) => {
  420. var jsonData = response.data;
  421. self.environmentList = jsonData.data;
  422. });
  423. dataDictionaryApi.findByCatalogName({
  424. catalogName: "水箱材质",
  425. })
  426. .then((response) => {
  427. var jsonData = response.data;
  428. self.materialList = jsonData.data;
  429. });
  430. dataDictionaryApi.findByCatalogName({
  431. catalogName: "施工难度",
  432. })
  433. .then((response) => {
  434. var jsonData = response.data;
  435. self.difficultyList = jsonData.data;
  436. });
  437. },
  438. methods: {
  439. closeDialog() {
  440. this.$emit("close", false);
  441. },
  442. handleSubmit() {
  443. var self = this;
  444. this.$refs["form"].validate((valid) => {
  445. if (valid) {
  446. (function () {
  447. var id = self.formModel.id;
  448. if (id == null || id.length == 0) {
  449. return workOrderApi.add(self.formModel);
  450. } else {
  451. return workOrderApi.update(self.formModel);
  452. }
  453. })().then(function (response) {
  454. var jsonData = response.data;
  455. if (jsonData.result) {
  456. self.$message({
  457. message: "保存成功!",
  458. type: "success",
  459. });
  460. self.$emit("close", true);
  461. } else {
  462. self.$message({
  463. message: jsonData.message + "",
  464. type: "warning",
  465. });
  466. self.$emit("close", false);
  467. }
  468. });
  469. }
  470. });
  471. },
  472. handleAvatarSuccess(res, file) {
  473. var self = this;
  474. self.formModel.image = res.data;
  475. self.fileUrl =
  476. res.data + "?x-oss-process=image/resize,m_lfit,h_300,w_300";
  477. },
  478. beforeAvatarUpload(file) {
  479. const isLt2M = file.size / 1024 / 1024 < 2;
  480. if (!isLt2M) {
  481. this.$message.error('上传头像图片大小不能超过 2MB!');
  482. }
  483. return isLt2M;
  484. }
  485. },
  486. async mounted() {
  487. var self = this;
  488. self.loading = true;
  489. (function () {
  490. if (self.businessKey != null && self.businessKey.length > 0) {
  491. return workOrderApi.edit(self.businessKey);
  492. } else {
  493. return workOrderApi.create();
  494. }
  495. })()
  496. .then((response) => {
  497. self.showModal = true;
  498. var jsonData = response.data;
  499. if (jsonData.result) {
  500. self.formModel = jsonData.data.workOrder;
  501. self.formModel2 = jsonData.data.installationRequirement;
  502. self.formModel3 = jsonData.data.receiveRequire;
  503. self.formModel4.customerName = jsonData.data.customerName;
  504. self.formModel4.customerPhone = jsonData.data.customerPhone;
  505. self.tableData = jsonData.data.commentInfoList;
  506. self.technicianInfo = jsonData.data.technicianInfo;
  507. self.imageList = jsonData.data.imageList;
  508. self.constructionProgressList = jsonData.data.constructionProgressList;
  509. let image = self.formModel.image;
  510. if (image != null) {
  511. self.fileUrl = image
  512. }
  513. } else {
  514. self.$message.error(jsonData.message + "");
  515. }
  516. self.loading = false;
  517. })
  518. .catch((error) => {
  519. self.$message.error(error + "");
  520. self.loading = false;
  521. });
  522. },
  523. components: {
  524. },
  525. };
  526. </script>
  527. <style scoped>
  528. .user-panel {
  529. margin: 10px auto;
  530. }
  531. .avatar-uploader .el-upload {
  532. border: 1px dashed #d9d9d9;
  533. border-radius: 6px;
  534. cursor: pointer;
  535. position: relative;
  536. overflow: hidden;
  537. }
  538. .avatar-uploader .el-upload:hover {
  539. border-color: #409EFF;
  540. }
  541. .avatar-uploader-icon {
  542. font-size: 28px;
  543. color: #8c939d;
  544. width: 178px;
  545. height: 178px;
  546. line-height: 178px;
  547. text-align: center;
  548. }
  549. .avatar {
  550. width: 178px;
  551. height: 178px;
  552. display: block;
  553. }
  554. .box-card{
  555. margin-bottom:10px
  556. }
  557. .img{
  558. width: 100px;
  559. height: 100px;
  560. margin:10px
  561. }
  562. </style>