add.html 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990
  1. {extend name="common/common2" /}
  2. {block name="main"}
  3. <style>
  4. .ctable td{
  5. min-width: 150px!important;
  6. max-width: 300px!important;
  7. }
  8. </style>
  9. <div class="row">
  10. <div class="col-sm-12">
  11. <div class="ibox float-e-margins">
  12. <div class="ibox-title">
  13. <h5>{$meta_title}</h5>
  14. <div class="ibox-tools">
  15. <a class="toback" href="{:url('index')}">
  16. 返回上一页
  17. </a>
  18. </div>
  19. </div>
  20. <div class="ibox-content" id="vue-plan">
  21. <p><br></p>
  22. <div class="row">
  23. <div class="col-xs-6 col-xs-offset-3">
  24. <el-steps :active="step" align-center finish-status="success">
  25. <el-step title="配置地点"></el-step>
  26. <el-step title="配置排班"></el-step>
  27. <el-step title="任务确认"></el-step>
  28. </el-steps>
  29. </div>
  30. </div>
  31. <p><br></p>
  32. <form method="post" class="form-horizontal">
  33. <div v-if="step == 0">
  34. <div class="form-group">
  35. <label class="col-sm-2 control-label">任务名称<span class="text-danger">*</span></label>
  36. <div class="col-sm-8">
  37. <input type="text" class="form-control" v-model="title" value="" placeholder="请输入任务名称">
  38. </div>
  39. </div>
  40. <div class="form-group">
  41. <label class="col-sm-2 control-label">计划时间<span class="text-danger">*</span></label>
  42. <div class="col-sm-8">
  43. <el-date-picker
  44. style="width: 100%"
  45. size="small"
  46. v-model="date"
  47. type="daterange"
  48. range-separator="至"
  49. value-format="yyyy-MM-dd"
  50. start-placeholder="开始日期"
  51. end-placeholder="结束日期">
  52. </el-date-picker>
  53. </div>
  54. </div>
  55. <div class="form-group">
  56. <label class="col-sm-2 control-label">地点<span class="text-danger">*</span></label>
  57. <div class="col-sm-8">
  58. <button class="btn btn-sm btn-primary" type="button" @click="selectAddr()">添加地点</button>
  59. <button class="btn btn-sm btn-primary" type="button" @click="selectForm()">设置检查内容</button>
  60. <button class="btn btn-sm btn-danger" type="button" @click="delAddrs">移除</button>
  61. <el-table
  62. v-if="tableData.length > 0"
  63. :data="tableData"
  64. height="350"
  65. border
  66. @selection-change="handleSelectionChange"
  67. style="width: 100%">
  68. <el-table-column
  69. type="selection"
  70. width="60">
  71. </el-table-column>
  72. <el-table-column
  73. prop="addrTitle"
  74. label="地点名称"
  75. width="180">
  76. </el-table-column>
  77. <el-table-column
  78. prop="formTitle"
  79. label="表单内容"
  80. >
  81. </el-table-column>
  82. <el-table-column label="操作" width="180">
  83. <template slot-scope="scope">
  84. <button class="btn btn-sm" type="button" @click="moveUp(scope.$index, scope.row)">上移</button>
  85. <button class="btn btn-sm" type="button" @click="moveDown(scope.$index, scope.row)">下移</button>
  86. </template>
  87. </el-table-column>
  88. </el-table>
  89. </div>
  90. </div>
  91. </div>
  92. <div v-if="step == 1">
  93. <div class="form-group">
  94. <label class="col-sm-2 control-label">设置人员<span class="text-danger">*</span></label>
  95. <div class="col-sm-8">
  96. <el-select
  97. v-model="userIds"
  98. multiple
  99. collapse-tags
  100. style="width: 100%"
  101. size="small"
  102. placeholder="请选择">
  103. <el-option
  104. v-for="item in users"
  105. :key="item.id"
  106. :label="item.title"
  107. :value="item.id">
  108. </el-option>
  109. </el-select>
  110. </div>
  111. </div>
  112. <div class="form-group">
  113. <label class="col-sm-2 control-label">时间段配置<span class="text-danger">*</span></label>
  114. <div class="col-sm-8">
  115. 每
  116. <el-select v-model="dateType" placeholder="请选择" style="width: 100px;" size="small">
  117. <el-option
  118. v-for="item in dateTypes"
  119. :key="item.id"
  120. :label="item.title"
  121. :value="item.id">
  122. </el-option>
  123. </el-select>
  124. 的
  125. <span v-if="dateType == 3">
  126. <el-date-picker
  127. style="width: 130px"
  128. size="small"
  129. v-model="dateFrom"
  130. type="date"
  131. value-format="yyyy-MM-dd"
  132. placeholder="请选择日期">
  133. </el-date-picker>
  134. 开始,工作
  135. <el-input type="number" @input="changePlay" v-model="datePlay" size="small" style="width: 80px;" placeholder="请输入天数"></el-input>
  136. 天,
  137. 暂停
  138. <el-input type="number" @input="changePause" v-model="datePause" size="small" style="width: 80px;" placeholder="请输入天数"></el-input>
  139. 天,每天的
  140. </span>
  141. <button v-if="dateType == 2" class="btn btn-sm btn-default" type="button" @click="selectWeek">添加周</button>
  142. <button class="btn btn-sm btn-default" type="button" @click="selectTime">添加时间段</button>
  143. 开始任务
  144. <div v-if="dateType == 2" style="padding: 5px 0">
  145. 已选择周:
  146. <el-tag
  147. style="margin-right: 5px;cursor: pointer"
  148. v-for="item in dateWeeks"
  149. size="small"
  150. :key="item.id"
  151. :type="item.type"
  152. effect="dark"
  153. >
  154. {{ item.title }}
  155. </el-tag>
  156. </div>
  157. <div style="padding: 5px 0">
  158. 已选择时间段:
  159. <el-tag
  160. style="margin-right: 5px;margin-bottom: 5px"
  161. :key="index"
  162. v-for="(item,index) in dateTimes"
  163. size="small"
  164. >
  165. {{item.stime}} ~ <span v-if="item.stype == 1">{{item.sday}}天后</span>{{item.etime}}
  166. </el-tag>
  167. </div>
  168. <el-button @click="createClass" size="small">生成任务表</el-button>
  169. <div style="padding: 5px 0">
  170. <div class="table-responsive" v-if="tasks.list.length > 0">
  171. <table class="table table-bordered ctable text-center">
  172. <tr>
  173. <td></td>
  174. <td v-for="(item,index) in tasks.days" :key="index">{{item}}</td>
  175. </tr>
  176. <tr v-for="(vo,idx) in tasks.list" :key="idx">
  177. <td>{{vo.time.stime}} ~ <span v-if="vo.time.stype == 1">{{vo.time.sday}}天后</span>{{vo.time.etime}}</td>
  178. <td v-for="(item,index) in tasks.days" :key="index">
  179. <template v-for="(v,id) in vo.list">
  180. <span v-if="item == v.day" :key="id">{{v.userNames}}</span>
  181. </template>
  182. </td>
  183. </tr>
  184. </table>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. <div v-if="step == 2">
  191. <div style="padding: 5px 0">
  192. <div class="table-responsive" v-if="tasks.list.length > 0">
  193. <table class="table table-bordered ctable text-center">
  194. <tr>
  195. <td></td>
  196. <td></td>
  197. <td v-for="(item,index) in tasks.days" :key="index"><a href="javascript:;" @click="delDay(item)">删除列</a></td>
  198. </tr>
  199. <tr>
  200. <td></td>
  201. <td></td>
  202. <td v-for="(item,index) in tasks.days" :key="index">{{item}}</td>
  203. </tr>
  204. <tr v-for="(vo,idx) in tasks.list" :key="idx">
  205. <td><a href="javascript:;" @click="delTimes(vo.time)">删除行</a></td>
  206. <td>{{vo.time.stime}} ~ <span v-if="vo.time.stype == 1">{{vo.time.sday}}日后</span>{{vo.time.etime}}</td>
  207. <td v-for="(item,index) in tasks.days" :key="index">
  208. <template v-for="(v,id) in vo.list">
  209. <span v-if="item == v.day" :key="id">{{v.userNames}}</span>
  210. </template>
  211. </td>
  212. </tr>
  213. </table>
  214. </div>
  215. </div>
  216. </div>
  217. <div class="hr-line-dashed"></div>
  218. <div class="form-group">
  219. <div class="col-sm-6 col-sm-offset-2">
  220. <button v-if="step == 2" class="btn btn-primary" target-form="form-horizontal" type="button" id="saveSubmit" @click="saveSubmit">保 存</button>
  221. <button v-if="step == 1||step == 2" class="btn btn-default" type="button" @click="pre">上一步</button>
  222. <button v-if="step == 0||step == 1" class="btn btn-info" type="button" @click="next">下一步</button>
  223. </div>
  224. </div>
  225. </form>
  226. <el-dialog
  227. title="选择地点"
  228. :visible.sync="dialogVisibleAddr"
  229. width="500px"
  230. :before-close="handleClose"
  231. >
  232. <el-input
  233. placeholder="请输入"
  234. v-model="addrkeyword"
  235. @input="searchAddr"
  236. clearable>
  237. </el-input>
  238. <el-table
  239. ref="singleTable"
  240. :data="addrs"
  241. height="300"
  242. @selection-change="handleSelectionChangeAddr"
  243. style="width: 100%">
  244. <el-table-column
  245. type="selection"
  246. width="60">
  247. </el-table-column>
  248. <el-table-column
  249. property="title"
  250. label="名称"
  251. >
  252. </el-table-column>
  253. </el-table>
  254. <span slot="footer" class="dialog-footer">
  255. <el-button @click="dialogVisibleAddr = false">取 消</el-button>
  256. <el-button type="primary" @click="saveAddr">确 定</el-button>
  257. </span>
  258. </el-dialog>
  259. <el-dialog
  260. title="选择检查内容"
  261. :visible.sync="dialogVisibleForm"
  262. width="500px"
  263. :before-close="handleCloseForm"
  264. >
  265. <el-input
  266. placeholder="请输入"
  267. v-model="formkeyword"
  268. @input="searchForm"
  269. clearable>
  270. </el-input>
  271. <el-table
  272. v-if="dialogVisibleForm"
  273. ref="singleTable2"
  274. :data="forms"
  275. highlight-current-row
  276. height="300"
  277. @current-change="handleCurrentChange"
  278. style="width: 100%">
  279. <el-table-column
  280. type="index"
  281. label="序号"
  282. width="60">
  283. </el-table-column>
  284. <el-table-column
  285. property="title"
  286. label="名称"
  287. >
  288. </el-table-column>
  289. </el-table>
  290. <span slot="footer" class="dialog-footer">
  291. <el-button @click="handleCloseForm">取 消</el-button>
  292. <el-button type="primary" @click="saveForm">确 定</el-button>
  293. </span>
  294. </el-dialog>
  295. <el-dialog
  296. title="选择周"
  297. :visible.sync="dialogVisibleWeek"
  298. width="500px"
  299. :before-close="handleCloseWeek"
  300. >
  301. <div class="text-center">
  302. <el-tag
  303. style="margin-right: 5px;cursor: pointer"
  304. v-for="item in weeks"
  305. size="small"
  306. :key="item.id"
  307. :type="item.type"
  308. effect="dark"
  309. @click="handleWeek(item)"
  310. >
  311. {{ item.title }}
  312. </el-tag>
  313. </div>
  314. <span slot="footer" class="dialog-footer">
  315. <el-button @click="dialogVisibleWeek = false">取 消</el-button>
  316. <el-button type="primary" @click="saveWeek">确 定</el-button>
  317. </span>
  318. </el-dialog>
  319. <el-dialog
  320. title="时间段选择"
  321. :visible.sync="dialogVisibleTime"
  322. width="700px"
  323. :before-close="handleCloseTime"
  324. >
  325. <div style="padding: 5px 0">
  326. 选择时段:
  327. <el-time-picker style="width:130px" v-model="stime" format="HH:mm" value-format="HH:mm" size="small" placeholder="请选择时间"></el-time-picker>
  328. 至
  329. <el-select style="width:80px" v-model="stype" placeholder="请选择" size="small">
  330. <el-option label="今日" :value="0"></el-option>
  331. <el-option label="其他" :value="1"></el-option>
  332. </el-select>
  333. <el-input v-if="stype == 1" @input="changeSday" type="number" v-model="sday" size="small" style="width: 70px;" placeholder="天数"></el-input> 天后
  334. <el-time-picker style="width:130px" v-model="etime" format="HH:mm" value-format="HH:mm" size="small" placeholder="请选择时间"></el-time-picker>
  335. <el-button @click="addTime" size="small">添加</el-button>
  336. </div>
  337. <div style="padding: 5px 0">
  338. 已选择时间段:
  339. <el-tag
  340. style="margin-right: 5px;margin-bottom: 5px"
  341. size="small"
  342. :key="index"
  343. v-for="(item,index) in selTimes"
  344. closable
  345. @close="handleCloseTimes(item)">
  346. {{item.stime}} ~ <span v-if="item.stype == 1">{{item.sday}}天后</span>{{item.etime}}
  347. </el-tag>
  348. </div>
  349. <span slot="footer" class="dialog-footer">
  350. <el-button @click="dialogVisibleTime = false">取 消</el-button>
  351. <el-button type="primary" @click="saveTime">确 定</el-button>
  352. </span>
  353. </el-dialog>
  354. </div>
  355. </div>
  356. </div>
  357. </div>
  358. {/block}
  359. {block name="script"}
  360. <script>
  361. var ads = {:json_encode($address)};
  362. var frs = {:json_encode($greenForm)};
  363. var us = {:json_encode($user)};
  364. {empty name="info"}
  365. var info = null;
  366. {else /}
  367. var info = {:json_encode($info)};
  368. {/empty}
  369. new Vue({
  370. el: '#vue-plan',
  371. data: function() {
  372. return {
  373. title: '',
  374. dialogVisible: false,
  375. step: 0,
  376. date: '',
  377. tableData: [],
  378. selAddrForms: [], // 选择的地址表单
  379. addrs: ads,
  380. selAddrs:[], // 选择地址
  381. dialogVisibleAddr: false,
  382. addrkeyword: '',
  383. forms: frs,
  384. selForm: null,
  385. formkeyword: '',
  386. dialogVisibleForm: false,
  387. users: us, // 人员列表
  388. userIds:[], // 选择的人员
  389. dateTypes: [
  390. {id: 1,title: '天'},
  391. {id: 2,title: '周'},
  392. {id: 3,title: '自定义'},
  393. ],
  394. dateType: 1,
  395. dateFrom: '', // 自定义类型从哪天开始
  396. datePlay: 1,
  397. datePause: 1,
  398. dateWeeks: [], // 已选择的周
  399. dateTimes: [], // 已添加的时间段
  400. weeks: [
  401. {id:1,title:'周一',type: 'info'},
  402. {id:2,title:'周二',type: 'info'},
  403. {id:3,title:'周三',type: 'info'},
  404. {id:4,title:'周四',type: 'info'},
  405. {id:5,title:'周五',type: 'info'},
  406. {id:6,title:'周六',type: 'info'},
  407. {id:0,title:'周日',type: 'info'},
  408. ],
  409. selWeeks: [],
  410. dialogVisibleWeek: false,
  411. dialogVisibleTime: false,
  412. stime: '',
  413. etime: '',
  414. stype: 0,
  415. sday: 1,
  416. selTimes: [], // 弹框已选的时间段
  417. tasks: { // 任务
  418. days: [],
  419. list: [],
  420. },
  421. }
  422. },
  423. watch: {
  424. },
  425. computed: {
  426. addrIds() { // 以保存的地址id
  427. let ids = [];
  428. this.tableData.forEach((item) => {
  429. ids.push(item.addrId);
  430. });
  431. return ids;
  432. },
  433. },
  434. created(){
  435. if(info){
  436. this.title = info.title;
  437. this.date = [info.start_time,info.end_time];
  438. this.tableData = info.content.addrForms;
  439. this.userIds = info.content.userIds;
  440. this.dateType = info.content.dateType;
  441. this.dateForm = info.content.dateForm;
  442. this.datePlay = info.content.datePlay;
  443. this.datePause = info.content.datePause;
  444. this.dateWeeks = info.content.dateWeeks;
  445. this.dateTimes = info.content.dateTimes;
  446. this.datePause = info.content.datePause;
  447. this.datePause = info.content.datePause;
  448. }
  449. },
  450. methods: {
  451. next() {
  452. if(this.step == 0){ // 检查必填项
  453. if(!this.title){
  454. this.$message.error('请输入任务名称');
  455. return false;
  456. }
  457. if(!this.date){
  458. this.$message.error('请选择任务时间');
  459. return false;
  460. }
  461. if(this.tableData.length == 0){
  462. this.$message.error('请选择任务地点');
  463. return false;
  464. }
  465. let ff = false;
  466. this.tableData.forEach((item) => {
  467. if(item.formId == 0){
  468. ff = true;
  469. }
  470. });
  471. if(ff){
  472. this.$message.error('任务地点未配置检查内容');
  473. return false;
  474. }
  475. } else if(this.step == 1){
  476. if(this.userIds.length <= 0){
  477. this.$message.error('未设置人员');
  478. return false;
  479. }
  480. if(this.dateType == 2 && this.dateWeeks.length <= 0){ // 周
  481. this.$message.error('未选择周');
  482. return false;
  483. }
  484. if(this.dateTimes.length <= 0){
  485. this.$message.error('未选择时间段');
  486. return false;
  487. }
  488. if(this.dateType == 3){ // 自定义
  489. if(!this.dateFrom){
  490. this.$message.error('未选择自定义开始日期');
  491. return false;
  492. }
  493. if(this.datePlay <= 0){
  494. this.$message.error('任务天数必须大于0');
  495. return false;
  496. }
  497. if(this.datePause < 0){
  498. this.$message.error('暂停天数必须大于等于0');
  499. return false;
  500. }
  501. }
  502. // 重新生成任务
  503. this.createClass();
  504. }
  505. if (this.step++ > 2) this.step = 0;
  506. },
  507. pre() {
  508. if (this.step-- < 0) this.step = 2;
  509. },
  510. handleSelectionChange(val){
  511. this.selAddrForms = val;
  512. },
  513. handleClose(){
  514. this.dialogVisibleAddr = false;
  515. },
  516. handleSelectionChangeAddr(val){
  517. this.selAddrs = val;
  518. },
  519. selectAddr(){
  520. this.dialogVisibleAddr = true;
  521. this.addrkeyword = '';
  522. this.addrs = ads.filter((item) => {
  523. return !this.addrIds.includes(item.id);
  524. });
  525. this.selAddrs = [];
  526. },
  527. searchAddr(){
  528. this.addrs= [];
  529. this.$nextTick(() => {
  530. if(this.addrkeyword){
  531. this.addrs = ads.filter((item) => {
  532. return item.title.indexOf(this.addrkeyword) !== -1;
  533. });
  534. }else{
  535. this.addrs = ads;
  536. }
  537. });
  538. },
  539. saveAddr(){
  540. const tbs = this.tableData;
  541. this.selAddrs.forEach((item) => {
  542. if(!this.addrIds.includes(item.id)){
  543. tbs.push({
  544. 'addrId': item.id,
  545. 'addrTitle': item.title,
  546. 'formId': 0,
  547. 'formTitle': '',
  548. });
  549. }
  550. });
  551. this.dialogVisibleAddr = false;
  552. this.$nextTick(() => {
  553. this.tableData = tbs;
  554. });
  555. },
  556. moveUp(idx,obj){
  557. if(idx > 0){
  558. let old = JSON.parse(JSON.stringify(this.tableData[idx]));
  559. let up = JSON.parse(JSON.stringify(this.tableData[idx - 1]));
  560. let tbs = this.tableData;
  561. this.tableData = [];
  562. this.$nextTick(() => {
  563. tbs[idx] = up;
  564. tbs[idx - 1] = old;
  565. this.tableData = tbs;
  566. })
  567. }
  568. console.log(this.tableData);
  569. },
  570. moveDown(idx,obj){ // 下移
  571. let length = this.tableData.length;
  572. if(idx < length - 1){
  573. let old = JSON.parse(JSON.stringify(this.tableData[idx]));
  574. let up = JSON.parse(JSON.stringify(this.tableData[idx + 1]));
  575. let tbs = this.tableData;
  576. this.tableData = [];
  577. this.$nextTick(() => {
  578. tbs[idx] = up;
  579. tbs[idx + 1] = old;
  580. this.tableData = tbs;
  581. })
  582. }
  583. },
  584. delAddrs(){ // 移除
  585. let sids = [];
  586. this.selAddrForms.forEach((item) => {
  587. sids.push(item.addrId);
  588. });
  589. if(sids.length == 0){
  590. this.$message.error('未选择地点');
  591. return false;
  592. }
  593. let tbs = this.tableData;
  594. this.tableData = [];
  595. this.$nextTick(() => {
  596. this.tableData = tbs.filter((item) => {
  597. return !sids.includes(item.addrId);
  598. });
  599. });
  600. console.log(this.selAddrForms,sids,this.tableData);
  601. },
  602. handleCurrentChange(val){ // 选中检查内容
  603. this.selForm = val;
  604. },
  605. handleCloseForm(){
  606. this.dialogVisibleForm = false;
  607. },
  608. searchForm(){
  609. this.forms= [];
  610. this.$nextTick(() => {
  611. if(this.formkeyword){
  612. this.forms = frs.filter((item) => {
  613. return item.title.indexOf(this.formkeyword) !== -1;
  614. });
  615. }else{
  616. this.forms = frs;
  617. }
  618. });
  619. },
  620. saveForm(){
  621. const tbs = this.tableData;
  622. this.tableData = [];
  623. let sids = [];
  624. this.selAddrForms.forEach((item) => {
  625. sids.push(item.addrId);
  626. });
  627. tbs.forEach((item) => {
  628. if(sids.includes(item.addrId)){
  629. item.formId = this.selForm?this.selForm.id:0;
  630. item.formTitle = this.selForm?this.selForm.title:'';
  631. }
  632. });
  633. this.dialogVisibleForm = false;
  634. this.$nextTick(() => {
  635. this.tableData = tbs;
  636. });
  637. },
  638. selectForm(){
  639. let sids = [];
  640. this.selAddrForms.forEach((item) => {
  641. sids.push(item.addrId);
  642. });
  643. if(sids.length == 0){
  644. this.$message.error('未选择地点');
  645. return false;
  646. }
  647. this.dialogVisibleForm = true;
  648. this.forms = frs;
  649. this.selForm = null;
  650. },
  651. handleCloseWeek(){
  652. this.dialogVisibleWeek = false;
  653. },
  654. saveWeek(){
  655. let ll = [];
  656. this.weeks.forEach((item) => {
  657. if(this.selWeeks.includes(item.id)){
  658. ll.push({
  659. id: item.id,
  660. title: item.title,
  661. type: 'primary'
  662. })
  663. }
  664. });
  665. this.dateWeeks = ll;
  666. this.dialogVisibleWeek = false;
  667. },
  668. handleWeek(obj){
  669. console.log(obj);
  670. if(this.selWeeks.includes(obj.id)){
  671. this.selWeeks = this.selWeeks.filter((item) => {
  672. return item !== obj.id;
  673. });
  674. }else{
  675. this.selWeeks.push(obj.id);
  676. }
  677. this.weeks.forEach((item) => {
  678. if(this.selWeeks.includes(item.id)){
  679. item.type = 'primary';
  680. }else{
  681. item.type = 'info';
  682. }
  683. });
  684. },
  685. selectWeek(){
  686. this.selWeeks = [];
  687. this.dateWeeks.forEach((item) => {
  688. this.selWeeks.push(item.id);
  689. });
  690. this.weeks.forEach((item) => {
  691. if(this.selWeeks.includes(item.id)){
  692. item.type = 'primary';
  693. }else{
  694. item.type = 'info';
  695. }
  696. });
  697. this.dialogVisibleWeek = true;
  698. },
  699. handleCloseTime(){
  700. this.dialogVisibleTime = false;
  701. },
  702. addTime(){
  703. if(!this.stime || !this.etime){
  704. this.$message.error('请选择时间段');
  705. return false;
  706. }
  707. if(this.stype == 0 && this.stime >= this.etime){
  708. this.$message.error('时间段错误');
  709. return false;
  710. }
  711. if(this.stype == 1 && this.sday < 1){
  712. this.$message.error('天数必须大于0');
  713. return false;
  714. }
  715. // 检查时间段是否重复
  716. let ff = false;
  717. this.selTimes.forEach((item) => {
  718. if(item.stype == this.stype &&item.sday == this.sday && item.stime == this.stime && item.etime == this.etime){
  719. ff = true;
  720. }
  721. });
  722. if(ff){
  723. this.$message.error('该时间段已存在');
  724. return false;
  725. }
  726. this.selTimes.push({
  727. stime: this.stime,
  728. etime: this.etime,
  729. stype: this.stype,
  730. sday: this.sday
  731. })
  732. },
  733. saveTime(){
  734. this.dateTimes = JSON.parse(JSON.stringify(this.selTimes));
  735. this.handleCloseTime();
  736. },
  737. handleCloseTimes(obj){
  738. this.selTimes = this.selTimes.filter((item) => {
  739. return item.stime != obj.stime || item.etime != obj.etime || item.stype != obj.stype || item.sday != obj.sday;
  740. })
  741. },
  742. selectTime(){
  743. this.dialogVisibleTime = true;
  744. this.selTimes = JSON.parse(JSON.stringify(this.dateTimes));
  745. this.stime = '';
  746. this.etime = '';
  747. this.stype = 0;
  748. this.sday = 1;
  749. },
  750. changeSday(){
  751. if (this.sday) {
  752. // 限制整数
  753. this.sday = this.sday.replace(/[^\d]/g, '');
  754. }
  755. },
  756. createClass(){
  757. if(this.userIds.length <= 0){
  758. this.$message.error('未设置人员');
  759. return false;
  760. }
  761. if(this.dateType == 2 && this.dateWeeks.length <= 0){ // 周
  762. this.$message.error('未选择周');
  763. return false;
  764. }
  765. if(this.dateTimes.length <= 0){
  766. this.$message.error('未选择时间段');
  767. return false;
  768. }
  769. if(this.dateType == 3){ // 自定义
  770. if(!this.dateFrom){
  771. this.$message.error('未选择自定义开始日期');
  772. return false;
  773. }
  774. if(this.datePlay <= 0){
  775. this.$message.error('任务天数必须大于0');
  776. return false;
  777. }
  778. if(this.datePause < 0){
  779. this.$message.error('暂停天数必须大于等于0');
  780. return false;
  781. }
  782. }
  783. let days = this.formatDays();
  784. this.formatTasks(days);
  785. },
  786. formatTasks(days){
  787. this.tasks = {
  788. days: days,
  789. list: [],
  790. };
  791. let list = [];
  792. this.dateTimes.forEach((item) => {
  793. let ts = [];
  794. days.forEach((item2) => {
  795. ts.push({
  796. day: item2,
  797. userIds: this.userIds,
  798. userNames: this.getUserNames(),
  799. });
  800. });
  801. list.push({
  802. time: item,
  803. list: ts,
  804. })
  805. });
  806. this.tasks = {
  807. days: days,
  808. list: list,
  809. };
  810. console.log('tasks',this.tasks);
  811. },
  812. delDay(day){ // 删除列
  813. let ts = JSON.parse(JSON.stringify(this.tasks));
  814. this.tasks = null;
  815. let days = ts.days.filter((item) => {
  816. return item != day;
  817. });
  818. this.formatTasks(days);
  819. },
  820. delTimes(obj){ // 删除行
  821. let days = JSON.parse(JSON.stringify(this.tasks.days));
  822. this.tasks = null;
  823. this.dateTimes = this.dateTimes.filter((item) => {
  824. return item.stime != obj.stime || item.etime != obj.etime || item.stype != obj.stype || item.sday != obj.sday;
  825. });
  826. this.formatTasks(days);
  827. },
  828. saveSubmit(){ // 表单提交
  829. if(this.tasks.days.length <= 0||this.tasks.list.length <= 0){
  830. this.$message.error('未设置任务');
  831. return false;
  832. }
  833. let content = {
  834. addrForms: this.tableData,
  835. userIds: this.userIds,
  836. dateType: this.dateType,
  837. dateFrom: this.dateType == 3?this.dateFrom:'',
  838. datePlay: this.dateType == 3?this.datePlay:0,
  839. datePause: this.dateType == 3?this.datePause:0,
  840. dateWeeks: this.dateType == 2?this.dateWeeks:[],
  841. dateTimes: this.dateTimes,
  842. tasks: this.tasks
  843. };
  844. let json = {
  845. title: this.title,
  846. start_time: this.date[0],
  847. end_time: this.date[1],
  848. content: JSON.stringify(content),
  849. };
  850. let that = this;
  851. $('#saveSubmit').attr("disabled", true).html('保 存 中');
  852. $.ajax({
  853. url: "{:url('GreenPlan/add')}",
  854. type: 'POST',
  855. data: json,
  856. success: function(ret){
  857. if(ret.code == 1){
  858. window.location.href = "{:url('index')}";
  859. }else{
  860. that.$message.error(ret.msg);
  861. }
  862. $('#saveSubmit').attr("disabled", false).html('保 存');
  863. },
  864. error: function (){
  865. that.$message.error('请求失败');
  866. $('#saveSubmit').attr("disabled", false).html('保 存');
  867. }
  868. });
  869. },
  870. getUserNames(){
  871. let ns = [];
  872. this.userIds.forEach((item) => {
  873. this.users.forEach((item2) => {
  874. if(item2.id == item){
  875. ns.push(item2.title);
  876. }
  877. });
  878. });
  879. return ns.join(',');
  880. },
  881. formatDays(){ // 格式化任务日期
  882. let days = this.getDateAll(this.date[0],this.date[1]);
  883. let nday = [];
  884. let ws = [];
  885. this.dateWeeks.forEach((item) => {
  886. ws.push(item.id);
  887. });
  888. let i = 0;
  889. let j = 0;
  890. days.forEach((item) => {
  891. if(this.dateType == 1){ // 日
  892. nday.push(item);
  893. }else if(this.dateType == 2){ // 周
  894. let ww = this.getWeekByDay(item);
  895. if(ws.includes(ww)){
  896. nday.push(item);
  897. }
  898. }else if(this.dateType == 3){ // 自定义
  899. if(this.dateFrom <= item){
  900. if(i + j < this.datePlay){
  901. nday.push(item);
  902. i++;
  903. }else if((i + j) >= this.datePlay && (i+j) < this.datePause){
  904. j++;
  905. }else{
  906. i = 0;
  907. j = 0;
  908. }
  909. }
  910. }
  911. });
  912. return nday;
  913. },
  914. changePlay(){
  915. if (this.datePlay) {
  916. // 限制整数
  917. this.datePlay = this.datePlay.replace(/[^\d]/g, '');
  918. }
  919. },
  920. changePause(){
  921. if (this.datePause) {
  922. // 限制整数
  923. this.datePause = this.datePause.replace(/[^\d]/g, '');
  924. }
  925. },
  926. getDateAll(starDay, endDay) { // 获取两个时间段的所有日期
  927. var arr = [];
  928. var dates = [];
  929. // 设置两个日期UTC时间
  930. var db = new Date(starDay);
  931. var de = new Date(endDay);
  932. // 获取两个日期GTM时间
  933. var s = db.getTime() - 24 * 60 * 60 * 1000;
  934. var d = de.getTime() - 24 * 60 * 60 * 1000;
  935. // 获取到两个日期之间的每一天的毫秒数
  936. for (var i = s; i <= d; ) {
  937. i = i + 24 * 60 * 60 * 1000;
  938. arr.push(parseInt(i));
  939. }
  940. // 获取每一天的时间 YY-MM-DD
  941. for (var j in arr) {
  942. var time = new Date(arr[j]);
  943. var year = time.getFullYear(time);
  944. var mouth =
  945. time.getMonth() + 1 >= 10
  946. ? time.getMonth() + 1
  947. : "0" + (time.getMonth() + 1);
  948. var day =
  949. time.getDate() >= 10
  950. ? time.getDate()
  951. : "0" + time.getDate();
  952. var YYMMDD = year + "-" + mouth + "-" + day;
  953. dates.push(YYMMDD);
  954. }
  955. return dates;
  956. },
  957. getWeekByDay(dateString,t=0) { // 获取某天是周几
  958. var dateArray = dateString.split("-");
  959. date = new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]);
  960. if(t == 1){
  961. return "周" + "日一二三四五六".charAt(date.getDay());
  962. }else{
  963. return date.getDay();
  964. }
  965. }
  966. }
  967. })
  968. </script>
  969. {/block}