setTask.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. <template>
  2. <div>
  3. <el-breadcrumb separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item>首页</el-breadcrumb-item>
  5. <el-breadcrumb-item :to="{ path: '/jc/routineMonitorqt' }">任务列表</el-breadcrumb-item>
  6. <el-breadcrumb-item>基本信息</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
  9. <el-tab-pane label="基本信息" name="first">
  10. <el-form :model="readForm" label-position="right" label-width="auto" style="margin-left: 35%;">
  11. <el-form-item label="发布单位:" prop="releaser" class="labelItem" required>
  12. <div>{{readForm.releaser}}</div>
  13. </el-form-item>
  14. <el-form-item label="任务名称:" prop="task_name" class="labelItem" required>
  15. <div>{{readForm.task_name}}</div>
  16. </el-form-item>
  17. <el-form-item label="任务优先级:" prop="level" class="labelItem" required>
  18. <div v-if="readForm.level=='0'">一般</div>
  19. <div v-else-if="readForm.level=='1'">紧急</div>
  20. <div v-else>特急</div>
  21. </el-form-item>
  22. <el-form-item label="监测类型:" prop="task_class" width="70px" class="labelItem" required>
  23. <div>{{readForm.task_class}}</div>
  24. </el-form-item>
  25. <el-form-item label="检测模型:" prop="task_class" width="70px" class="labelItem" required>
  26. <el-select v-model="bindForm.test_model_id" size="mini">
  27. <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id">
  28. </el-option>
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="抽检分离:" prop="is_divide" width="70px" class="labelItem">
  32. <el-select v-model="bindForm.is_divide" size="mini">
  33. <el-option v-for="item in divideOptions" :key="item.id" :label="item.name" :value="item.id">
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="年度:" prop="year" class="labelItem" required>
  38. <div>{{readForm.year}}</div>
  39. </el-form-item>
  40. <!-- <el-form-item label="发布机构所属区域:" prop="year" class="labelItem" required>
  41. <div>{{readForm.year}}</div>
  42. </el-form-item> -->
  43. <el-form-item label="机构级别:" prop="groupname" class="labelItem" required>
  44. <div>{{readForm.releaserInfo.groupname}}</div>
  45. </el-form-item>
  46. <!-- <el-form-item label="批次:" prop="batch" width="200px" class="labelItem">
  47. <div>{{readForm.batch}}</div>
  48. </el-form-item> -->
  49. <el-form-item label="任务时间:" prop="starttime" width="200px" class="labelItem" required>
  50. <div>{{readForm.starttime}} 至 {{readForm.endtime}}</div>
  51. </el-form-item>
  52. <el-form-item label="抽样信息上报截止时间:" size="mini" class="labelItem" required>
  53. <el-date-picker v-model="bindForm.endtime_cydsb" type="date" value-format="yyyy-MM-dd">
  54. </el-date-picker>
  55. </el-form-item>
  56. <el-form-item label="附件:" prop="file_url" class="labelItem">
  57. <div v-if="readForm.file_url==null">无</div>
  58. <el-link v-else type="primary" :href="readForm.file_url">{{readForm.file_name}}</el-link>
  59. </el-form-item>
  60. <el-form-item label="文件号:" prop="filenum" width="200px" class="labelItem">
  61. <div v-if="readForm.filenum==null">无</div>
  62. <div v-else>{{readForm.filenum}}</div>
  63. </el-form-item>
  64. <el-form-item label="备注:" prop="log" class="labelItem">
  65. <div v-if="readForm.log==null">无</div>
  66. <div v-else>{{readForm.log}}</div>
  67. </el-form-item>
  68. </el-form>
  69. <div class="footer">
  70. <el-button type="success" size="mini" @click="bindModel">保存</el-button>
  71. <el-button type="success" size="mini" @click="next">下一步</el-button>
  72. </div>
  73. </el-form>
  74. </el-tab-pane>
  75. <el-tab-pane label="机构与地域" name="second">
  76. <!-- 头部搜索栏 -->
  77. <el-row style="margin-right: 0px;">
  78. <el-form style="display: flex; flex-direction: row; margin-left: 5px;">
  79. <el-form-item label="抽样机构" class="select" size="mini">
  80. <el-input v-model="form.bear_unit" @focus="getTestListShow = true"></el-input>
  81. </el-form-item>
  82. <el-form-item label="检测机构" class="select" size="mini">
  83. <el-input v-model="form.check_unit" @focus="getTestListShow2 = true"></el-input>
  84. </el-form-item>
  85. <el-form-item label="抽样数量" class="select" size="mini">
  86. <el-input v-model="form.sample_number"></el-input>
  87. </el-form-item>
  88. <el-form-item label="报告上传单位" class="select" size="mini">
  89. <el-input v-model="form.report_unit" @focus="getTestListShow1 = true"></el-input>
  90. </el-form-item>
  91. </el-form>
  92. </el-row>
  93. <el-row style="margin-right: 0px;">
  94. <el-col :span="10">
  95. <el-form style="display: flex; flex-direction: row;">
  96. <el-form-item label="抽样地区" class="select">
  97. <el-cascader size="mini" :options="region" v-model="selectedOptions"
  98. @change="handleChange">
  99. </el-cascader>
  100. </el-form-item>
  101. <el-form-item label="报告上传时间:" class="select" size="mini">
  102. <el-date-picker v-model="form.uploadtime" type="date" value-format="yyyy-MM-dd">
  103. </el-date-picker>
  104. </el-form-item>
  105. </el-form>
  106. </el-col>
  107. <el-col :span="5">
  108. <el-button type="primary" size="mini" plain @click="save()">保存
  109. </el-button>
  110. <!-- <el-button type="primary" size="small" plain icon="el-icon-edit-outline" @click="appear">
  111. 重置
  112. </el-button> -->
  113. <el-button type="primary" size="mini" plain @click="back()">上一步</el-button>
  114. <el-button type="primary" size="mini" plain @click="nexto()">下一步</el-button>
  115. </el-col>
  116. </el-row>
  117. </el-row>
  118. <!-- 表格数据区域-->
  119. <el-table ref="multipleTable" :data="underTask" border stripe highlight-current-row
  120. @selection-change="handleSelectionChange" style="width: 100%" :row-style="rowStyle"
  121. :cell-style="cellStyle">
  122. <el-table-column type="selection" width="50"></el-table-column>
  123. <el-table-column label="序号" width="50px">
  124. <template slot-scope="scope">
  125. {{ scope.$index+1 }}
  126. </template>
  127. </el-table-column>
  128. <el-table-column :key="table.label" v-for="table in tableHeader" :label="table.label"
  129. :prop="table.prop" align="center" :width="table.width" :fixed="table.fixed" />
  130. <el-table-column label="操作" align="center" fixed="right">
  131. <template slot-scope="scope">
  132. <el-button type="success" size="small" plain @click="sampleDetail(scope.row.sample_id)">删除
  133. </el-button>
  134. </template>
  135. </el-table-column>
  136. </el-table>
  137. <!-- 分页器区域-->
  138. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
  139. :current-page="queryInfo.pageNum" :page-sizes="[1,10, 15, 20]" :page-size="queryInfo.pageSize"
  140. layout="total, sizes, prev, pager, next, jumper" :total="underTasktotal" background />
  141. </el-tab-pane>
  142. <el-tab-pane label="总览" name="third">
  143. <taskdetail :task_id="task_id"></taskdetail>
  144. <div class="footer">
  145. <el-button type="success" size="mini" @click="release()">发布</el-button>
  146. <el-button type="success" size="mini" @click="next">导出总览</el-button>
  147. <el-button type="success" size="mini" @click="next">返回</el-button>
  148. </div>
  149. </el-tab-pane>
  150. </el-tabs>
  151. <!-- 选择抽样机构对话框 -->
  152. <el-dialog title="机构选择" :visible.sync="getTestListShow" width="50%" :close-on-click-modal="false"
  153. @open="getTestList()" class="dialogItem">
  154. <el-form v-if="getTestListShow">
  155. <!-- 表格数据区域-->
  156. <el-table ref="singleTable" :data="testList" row-key="id" @current-change="choseChange" border stripe
  157. highlight-current-row style="width: 100%">
  158. <el-table-column label="序号" width="50px">
  159. <template slot-scope="scope">
  160. {{ scope.$index+1 }}
  161. </template>
  162. </el-table-column>
  163. <el-table-column :key="table.prop" v-for="table in tableHeaders" :label="table.label"
  164. :prop="table.prop" align="center" :width="table.width" :fixed="table.fixed" />
  165. </el-table>
  166. <div>
  167. <!-- 分页器区域-->
  168. <el-pagination @size-change="handleSizeChanges" @current-change="handleCurrentChanges"
  169. :current-page="queryInfos.pageNum" :page-sizes="[1,10, 15, 20]" :page-size="queryInfos.pageSize"
  170. layout="total, sizes, prev, pager, next, jumper" :total="totals" background />
  171. <el-button style="" type="success" size="mini" @click="choseTest()">提交</el-button>
  172. </div>
  173. </el-form>
  174. </el-dialog>
  175. <!-- 选择报告上传单位对话框 -->
  176. <el-dialog title="机构选择" :visible.sync="getTestListShow1" width="50%" :close-on-click-modal="false"
  177. @open="getTestList()" class="dialogItem">
  178. <el-form v-if="getTestListShow1">
  179. <!-- 表格数据区域-->
  180. <el-table ref="singleTable" :data="testList" row-key="id" @current-change="choseChange1" border stripe
  181. highlight-current-row style="width: 100%">
  182. <el-table-column label="序号" width="50px">
  183. <template slot-scope="scope">
  184. {{ scope.$index+1 }}
  185. </template>
  186. </el-table-column>
  187. <el-table-column :key="table.prop" v-for="table in tableHeaders" :label="table.label"
  188. :prop="table.prop" align="center" :width="table.width" :fixed="table.fixed" />
  189. </el-table>
  190. <div>
  191. <!-- 分页器区域-->
  192. <el-pagination @size-change="handleSizeChanges" @current-change="handleCurrentChanges"
  193. :current-page="queryInfos.pageNum" :page-sizes="[1,10, 15, 20]" :page-size="queryInfos.pageSize"
  194. layout="total, sizes, prev, pager, next, jumper" :total="totals" background />
  195. <el-button style="" type="success" size="mini" @click="choseReportUnit()">提交</el-button>
  196. </div>
  197. </el-form>
  198. </el-dialog>
  199. <!-- 选择检测单位对话框 -->
  200. <el-dialog title="机构选择" :visible.sync="getTestListShow2" width="50%" :close-on-click-modal="false"
  201. @open="getTestList()" class="dialogItem">
  202. <el-form v-if="getTestListShow2">
  203. <!-- 表格数据区域-->
  204. <el-table ref="singleTable" :data="testList" row-key="id" @current-change="choseChange2" border stripe
  205. highlight-current-row style="width: 100%">
  206. <el-table-column label="序号" width="50px">
  207. <template slot-scope="scope">
  208. {{ scope.$index+1 }}
  209. </template>
  210. </el-table-column>
  211. <el-table-column :key="table.prop" v-for="table in tableHeaders" :label="table.label"
  212. :prop="table.prop" align="center" :width="table.width" :fixed="table.fixed" />
  213. </el-table>
  214. <div>
  215. <!-- 分页器区域-->
  216. <el-pagination @size-change="handleSizeChanges" @current-change="handleCurrentChanges"
  217. :current-page="queryInfos.pageNum" :page-sizes="[1,10, 15, 20]" :page-size="queryInfos.pageSize"
  218. layout="total, sizes, prev, pager, next, jumper" :total="totals" background />
  219. <el-button style="" type="success" size="mini" @click="choseCheckUnit()">提交</el-button>
  220. </div>
  221. </el-form>
  222. </el-dialog>
  223. </div>
  224. </template>
  225. <script>
  226. import {
  227. provinceAndCityData,
  228. regionData,
  229. provinceAndCityDataPlus,
  230. regionDataPlus,
  231. CodeToText,
  232. TextToCode
  233. } from 'element-china-area-data'
  234. import taskdetail from './taskdetail'
  235. export default {
  236. name: 'setTask',
  237. data() {
  238. return {
  239. size: 'medium',
  240. dialogVisible2: false,
  241. activeName: 'first',
  242. id: 0,
  243. readForm: {},
  244. queryInfo: {
  245. pageNum: 1,
  246. pageSize: 10
  247. },
  248. queryInfos: {
  249. pageNum: 1,
  250. pageSize: 10
  251. },
  252. cellStyle: {
  253. padding: 2 + 'px'
  254. },
  255. rowStyle: {
  256. height: 35 + 'px'
  257. },
  258. tableHeader: [{
  259. label: '抽样机构',
  260. prop: 'bear_name',
  261. width: 180,
  262. }, {
  263. label: '检测机构',
  264. prop: 'check_name'
  265. },
  266. {
  267. label: '抽样地区',
  268. prop: 'address'
  269. }, {
  270. label: '抽样数量',
  271. prop: 'sample_number'
  272. },
  273. {
  274. label: '报告上传单位',
  275. prop: 'report_name'
  276. }, {
  277. label: '报告上传截止时间',
  278. prop: 'uploadtime'
  279. }
  280. ],
  281. checkHeader2: [{
  282. label: '检测项目',
  283. prop: 'test_name',
  284. // fixed: 'left'
  285. }],
  286. // 数据表格数据
  287. tableData: [],
  288. total: 0,
  289. task_id: '',
  290. multipleSelection: null,
  291. // 模型列表
  292. options: [],
  293. bindForm: {
  294. test_model_id: '',
  295. endtime_cydsb: ''
  296. },
  297. // 弹出检测机构弹窗
  298. getTestListShow: false,
  299. getTestListShow1: false,
  300. getTestListShow2: false,
  301. tableHeaders: [{
  302. label: '单位名称',
  303. prop: 'name',
  304. width: 300
  305. // fixed: 'left'
  306. },
  307. {
  308. label: '机构类型',
  309. prop: 'groupname',
  310. // width: 40
  311. // fixed: 'left'
  312. }, {
  313. label: '所属区域',
  314. prop: 'dtRelyOnUnit',
  315. width: 300
  316. // fixed: 'left'
  317. }
  318. ],
  319. testList: [],
  320. totals: 0,
  321. form: {
  322. bear_unit_name: '',
  323. report_unit_name: '',
  324. check_unit_name: ''
  325. },
  326. currentRow: null,
  327. currentRow1: null,
  328. currentRow2: null,
  329. // 抽样地区
  330. region: regionData,
  331. selectedOptions: [],
  332. // 机构地域表格数据
  333. underTask: [],
  334. underTasktotal: 0,
  335. // 抽检分离选项
  336. divideOptions: [{
  337. id: '0',
  338. name: '否'
  339. },
  340. {
  341. id: '1',
  342. name: '是'
  343. }
  344. ]
  345. };
  346. },
  347. components: {
  348. taskdetail
  349. },
  350. mounted() {},
  351. created() {
  352. this.task_id = this.$route.params.id
  353. console.log(this.$route.params.id)
  354. this.getTaskDetail()
  355. this.getmodelList()
  356. this.getUnderTask()
  357. },
  358. methods: {
  359. // 跳转到检测
  360. nexto() {
  361. this.activeName = 'third'
  362. },
  363. // 跳转到基本信息
  364. back() {
  365. this.activeName = 'first'
  366. },
  367. // 机构与地域---保存
  368. async save() {
  369. this.form['task_id'] = this.task_id
  370. const {
  371. data: res
  372. } = await this.$http.post("AddUnderTask", this.form);
  373. if (res.code == 0) {
  374. this.$message({
  375. type: 'success',
  376. message: '保存成功!'
  377. });
  378. this.getUnderTask()
  379. }
  380. },
  381. // 获取机构地域表格
  382. async getUnderTask() {
  383. this.queryInfo['task_id'] = this.task_id
  384. const result = await this.$http.post('getUnderTask', this.queryInfo)
  385. // 判断业务逻辑
  386. if (result.data.code == 0) {
  387. this.underTask = result.data.data.rows
  388. this.underTasktotal = result.data.data.total
  389. }
  390. },
  391. // 提交选中报告上传单位
  392. choseReportUnit() {
  393. let that = this
  394. that.form.report_unit = that.currentRow1.name
  395. that.form.report_id = that.currentRow1.id
  396. that.getTestListShow1 = false
  397. },
  398. // 提交选中检测单位
  399. choseCheckUnit() {
  400. let that = this
  401. that.form.check_unit = that.currentRow2.name
  402. that.form.check_id = that.currentRow2.id
  403. that.getTestListShow2 = false
  404. },
  405. // 提交选中抽样机构
  406. choseTest() {
  407. let that = this
  408. that.form.bear_unit = that.currentRow.name
  409. that.form.bear_id = that.currentRow.id
  410. that.getTestListShow = false
  411. },
  412. // 获取选择抽样地区
  413. handleChange() {
  414. var that = this
  415. var loc = "";
  416. // console.log(this.form.place)
  417. for (let i = 0; i < this.selectedOptions.length; i++) {
  418. loc += CodeToText[this.selectedOptions[i]];
  419. }
  420. // console.log(loc)
  421. that.form.address = loc
  422. },
  423. /** 监听每页显示多少数据的改变 */
  424. handleSizeChanges(newSize) {
  425. this.queryInfos.pageSize = newSize
  426. this.getTestList()
  427. },
  428. /** 监听页码的改变 */
  429. handleCurrentChanges(newPage) {
  430. this.queryInfos.pageNum = newPage
  431. this.getTestList()
  432. },
  433. // 获取检测机构列表
  434. async getTestList() {
  435. const result = await this.$http.post('getTestList', this.queryInfos)
  436. // 判断业务逻辑
  437. if (result.data.code == 0) {
  438. this.testList = result.data.data.rows
  439. this.totals = result.data.data.total
  440. }
  441. },
  442. choseChange(val) {
  443. this.currentRow = val;
  444. },
  445. choseChange1(val) {
  446. this.currentRow1 = val;
  447. },
  448. choseChange2(val) {
  449. this.currentRow2 = val;
  450. },
  451. // 跳转到机构与地域
  452. next() {
  453. this.activeName = 'second'
  454. },
  455. // 获取模型列表
  456. async getmodelList() {
  457. const {
  458. data: res
  459. } = await this.$http.post(
  460. "getModelList", {
  461. 'pageNum': 1,
  462. 'pageSize': 100,
  463. type_id: ""
  464. }
  465. );
  466. this.options = res.data.rows
  467. },
  468. // 绑定模型
  469. async bindModel() {
  470. var that = this
  471. that.bindForm['id'] = that.task_id
  472. const {
  473. data: res
  474. } = await this.$http.post(
  475. "bindModel", this.bindForm
  476. );
  477. if (res.code == 0) {
  478. this.$message({
  479. type: 'success',
  480. message: '绑定模型成功!'
  481. });
  482. console.log(this.res)
  483. that.getTaskDetail()
  484. }
  485. },
  486. //发布
  487. async release() {
  488. var that = this
  489. const {
  490. data: res
  491. } = await this.$http.post("qtRelease", {
  492. task_id: that.task_id
  493. });
  494. this.$router.push({
  495. path: '/jc/routineMonitorqt',
  496. })
  497. },
  498. handleClick(tab, event) {
  499. console.log(tab, event);
  500. },
  501. // 获取任务详情
  502. async getTaskDetail() {
  503. var that = this
  504. const {
  505. data: res
  506. } = await this.$http.post("getTaskDetail", {
  507. task_id: that.task_id
  508. });
  509. console.log(res.data.product)
  510. if (res.data.product.length > 0) {
  511. if (res.data.product[0].type_id == '1') {
  512. res.data.model_type = '种植业'
  513. } else if (res.data.product[0].type_id == '2') {
  514. res.data.model_type = '畜牧业'
  515. } else if (res.data.product[0].type_id == '3') {
  516. res.data.model_type = '渔业'
  517. } else {
  518. res.data.model_type = '其他'
  519. }
  520. }
  521. this.readForm = res.data
  522. this.bindForm.endtime_cydsb = res.data.endtime_cydsb
  523. },
  524. /** 修复当用户在大于1的分页进行数据搜索没有返回值的问题 */
  525. setPageNum() {
  526. this.queryInfo.pageNum = 1
  527. this.getSampleList()()
  528. },
  529. setSelectedRow() {
  530. // 设置当前页已选项
  531. this.hander = true
  532. this.tableData.forEach(item => {
  533. if (this.list.includes(item[this.uniqueKey])) {
  534. this.$refs.multipleTable.toggleRowSelection(item, true)
  535. }
  536. })
  537. this.hander = false
  538. },
  539. /** 监听每页显示多少数据的改变 */
  540. handleSizeChange(newSize) {
  541. this.queryInfo.pageSize = newSize
  542. this.getSampleList()()
  543. },
  544. /** 监听页码的改变 */
  545. handleCurrentChange(newPage) {
  546. this.queryInfo.pageNum = newPage
  547. this.getSampleList()()
  548. },
  549. // 批量勾选
  550. handleSelectionChange(val) {
  551. this.multipleSelection = val
  552. console.log(this.multipleSelection)
  553. if (this.hander) return false
  554. // this.setSelectRows() // 处理选中的方法
  555. },
  556. }
  557. }
  558. </script>
  559. <style lang="less" scoped>
  560. .el-breadcrumb {
  561. margin-bottom: 20px;
  562. }
  563. // .el-form-item {
  564. // margin-bottom: 0px;
  565. // }
  566. .el-select {
  567. width: 210px;
  568. height: 100%;
  569. }
  570. .select {
  571. display: flex;
  572. flex-direction: row;
  573. margin-left: 10px;
  574. }
  575. .el-form-item {
  576. margin-left: 8px;
  577. margin-bottom: 5px;
  578. }
  579. .labelItem /deep/ .el-form-item__label {
  580. // width: 80px;
  581. text-align: center;
  582. vertical-align: middle;
  583. float: left;
  584. font-size: 14px;
  585. color: #606266;
  586. font-weight: bold;
  587. // line-height: 40px;
  588. padding: 0 20px 0 0;
  589. -webkit-box-sizing: border-box;
  590. box-sizing: border-box;
  591. }
  592. .demonstration {
  593. margin: 20px;
  594. }
  595. .el-form-item__content {
  596. // width: 200px;
  597. }
  598. .my-label {
  599. width: 100px;
  600. }
  601. .footer {
  602. margin-left: 45%;
  603. }
  604. </style>