index.vue 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320
  1. <template>
  2. <div>
  3. <van-nav-bar title="填写日报" left-text="返回" @click-left="back" fixed left-arrow/>
  4. <van-form class="login_form" @submit="register">
  5. <van-field readonly clickable name="datetimePicker" :value="form.createDate" label="时间选择" placeholder="点击选择时间"
  6. @click="showPicker = true" :rules="rules.createDate" />
  7. <van-popup v-model="showPicker" position="bottom">
  8. <van-datetime-picker v-model="currentDate" type="date" :min-date="minDate" :max-date="maxDate" @confirm="changeTime" @cancel="showPicker = false"/>
  9. </van-popup>
  10. <van-cell title="总时长(h)" v-if="reportTimeType.type == 3">
  11. <template>
  12. <van-stepper :disabled="!canEdit" v-model="reportTimeType.allday" @change="changeAllTime" min="0.5" max="12" step="0.5" :decimal-length="1" />
  13. </template>
  14. </van-cell>
  15. <!-- <van-cell title="待分配时长" :value="report.time + 'h'" size="large"></van-cell> -->
  16. <div class="form_domains" v-for="(item,index) in form.domains" :key="item.id">
  17. <div style="float:right;margin-top:10px;margin-right:10px;">
  18. <!-- <van-tag v-if="canEdit&&item.projectName.length>0" color="#fff"
  19. @click="copyProject(index)" style="border: 1px solid #20a0ff;padding:5px;"
  20. icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">复制项目</span></van-tag> -->
  21. <van-tag v-if="index>0&&canEdit" color="#fff"
  22. @click="delPro(index)" style="border: 1px solid #ff0000;padding:5px;margin-left:10px;"
  23. icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">删除项目</span></van-tag>
  24. </div>
  25. <!-- <van-icon v-if="index>0&&canEdit" class="form_del" name="delete" @click="delPro(index)" /> -->
  26. <van-cell-group :title="'项目' + (index+1)">
  27. <!-- <div>请选择投入项目</div> -->
  28. <van-field readonly name="projectId" clickable :value="item.projectName" label="投入项目" placeholder="请选择投入项目" @click="clickPicker(index, item)"
  29. :rules="[{ required: true, message: '请选择项目' }]" /><!--
  30. <van-popup v-model="showPickerProject" position="bottom">
  31. <van-picker show-toolbar :columns="project" value-key="projectName" @confirm="choseProject" @cancel="showPickerProject = false" />
  32. </van-popup> -->
  33. <!-- 相关维度 -->
  34. <van-field :value="item.weiduName" v-if="item.projectId && user.timeType.customDegreeActive == 1" readonly name="id" clickable :label="user.timeType.customDegreeName" placeholder="请选择" @click="clickPickers(index)"/>
  35. <van-popup v-model="showPickerProjects" position="bottom">
  36. <van-picker show-toolbar :columns="item.wuduList" value-key="name" @confirm="choseProjects" @cancel="showPickerProjects = false" />
  37. </van-popup>
  38. <van-cell title="专业进度" v-if="user.company.packageEngineering == 1">
  39. </van-cell>
  40. <van-field :disabled="!canEdit"
  41. type="number" :name="'progress_'+pItem.professionId" input-align="right"
  42. v-for="pItem in item.professionProgress" :key="pItem.professionId"
  43. :label="'-- '+pItem.professionName"
  44. >
  45. <template slot="input">
  46. <van-stepper v-model="pItem.progress" integer min="0" max="100" />%
  47. </template>
  48. </van-field>
  49. <van-field v-if="user.company.packageProject == 1" readonly name="taskId" :value="item.taskName" label="关联任务" placeholder="请选择关联任务" @click="clickPickerTask(index)"
  50. />
  51. <van-popup v-model="showPickerTask" position="bottom">
  52. <van-picker show-toolbar :columns="item.taskList" value-key="taskName" @confirm="choseTask" @cancel="showPickerTask = false" />
  53. </van-popup>
  54. <!-- <van-field readonly clickable class="form_input" :value="item.workingTime" name="workingTime" label="工作时长" placeholder="请输入工作时长(单位:小时)"
  55. :rules="[{ required: true, message: '请输入工作时长(单位:小时)' }]" @touchstart.native.stop="showNumberKey = true"/>
  56. <van-number-keyboard v-model="item.workingTime" :show="showNumberKey" close-button-text="完成" extra-key="." :maxlength="4" @blur="showNumberKey = false" /> -->
  57. <!-- 常规选择时间的方式 -->
  58. <!-- 全天上下午模式 -->
  59. <div v-if="reportTimeType.multiWorktime==0">
  60. <van-field v-if="reportTimeType.type < 2" readonly clickable :value="reportTimeType.type==0?item.label:(parseFloat(item.workingTime).toFixed(1)+'h')" label="工作时长" placeholder="请选择工作时长(小时)" @click="clickTimePicker(index)"
  61. :rules="[{ required: true, message: '请选择工作时长' }]"/>
  62. <van-popup v-model="showPickerTime" position="bottom">
  63. <van-picker show-toolbar :columns="timeType" value-key="label" @confirm="choseTimePick" @cancel="showPickerTime = false" />
  64. </van-popup>
  65. <!-- 选择数字时间长度模式 -->
  66. <van-popup v-model="showPickerHours" position="bottom">
  67. <van-picker show-toolbar :columns="timeRange"
  68. :default-index="15"
  69. @confirm="choseTimePick" @cancel="showPickerHours = false" />
  70. </van-popup>
  71. <!-- 时间段选择模式 -->
  72. <van-field readonly v-if="reportTimeType.type == 2" clickable name="datetimePicker" :value="item.startTime" label="开始时间" placeholder="点击选择时间"
  73. @click="canEdit?showStartTime = true:''" :disabled="!canEdit" />
  74. <van-popup v-model="showStartTime" position="bottom">
  75. <van-datetime-picker
  76. v-model="startTime"
  77. type="time"
  78. @confirm="confirmTime(item,0);"
  79. @cancel="showStartTime = false"
  80. :min-hour="0"
  81. :max-hour="23"
  82. />
  83. <!-- :filter="filter" 原本这个属性在里面 -->
  84. </van-popup>
  85. <van-field v-if="reportTimeType.type == 2" readonly clickable name="datetimePicker" :value="item.endTime" label="结束时间" placeholder="点击选择时间"
  86. @click="canEdit?showEndTime = true:''" :disabled="!canEdit" />
  87. <van-popup v-model="showEndTime" position="bottom" >
  88. <van-datetime-picker
  89. v-model="endTime"
  90. type="time"
  91. :min-hour="0"
  92. :max-hour="23"
  93. @confirm="confirmTime(item,1)"
  94. @cancel="showEndTime = false"
  95. />
  96. <!-- :filter="filter" 原本这个属性在里面 -->
  97. </van-popup>
  98. <van-cell v-if="reportTimeType.type == 3" >
  99. <template >
  100. <div>
  101. <span>用时占比</span>
  102. <van-slider :disabled="!canEdit" :min="10" :step="10" style="width:120px;display:inline-block;margin-left:50px;" v-model="item.progress" :value="100" @change="item.workingTime = (reportTimeType.allday*item.progress/100).toFixed(1)" >
  103. <template #button>
  104. <div class="custom-button">{{ item.progress }}%</div>
  105. </template>
  106. </van-slider>
  107. <span style="margin-left:10px;float:right;">{{item.workingTime}}小时</span>
  108. </div>
  109. </template>
  110. </van-cell>
  111. <van-field class="form_input" :disabled = "!canEdit"
  112. v-model="item.content" name="content" type="textarea" label="工作事项" placeholder="请输入工作事项"
  113. rows="3" autosize />
  114. </div>
  115. <!-- 多个时间和工作事项的选择方式 -->
  116. <div v-if="reportTimeType.multiWorktime==1">
  117. <div v-for="(timeItem, tindex) in item.worktimeList" :key="tindex" style="position:relative;border:#ccc 0.5px solid;margin:7px;">
  118. <van-tag v-if="tindex>0 && canEdit" style="position:absolute; right:-7px;top:-7px;z-index:10;"
  119. @click="removeTimeItem(item,tindex)">X</van-tag>
  120. <!-- 时间段选择模式 -->
  121. <van-field readonly v-if="reportTimeType.type == 2" :clickable="canEdit" name="datetimePicker"
  122. :value="timeItem.startTime" label="开始时间" placeholder="点击选择时间"
  123. :rules="[{ required: true, message: '必填项' }]"
  124. @click="canEdit?showStartDialog(timeItem):''" />
  125. <van-field v-if="reportTimeType.type == 2" readonly :clickable="canEdit" name="datetimePicker"
  126. :value="timeItem.endTime" label="结束时间" placeholder="点击选择时间"
  127. :rules="[{ required: true, message: '必填项' }]"
  128. @click="canEdit?showEndDialog(timeItem):''" />
  129. <van-field class="form_input" :disabled="!canEdit" style="color:#333;-webkit-text-fill-color:#646566;"
  130. v-model="timeItem.content" name="content" type="textarea" label="工作事项" placeholder="请输入工作事项"
  131. :rules="[{ required: true, message: '必填项' }]"
  132. rows="1" autosize />
  133. </div>
  134. <!--时间选择器 , 做统一处理,不能放到循环里,不然会有多个公用showStartTime,最后一个会现在最上层UI,导致BUG -->
  135. <van-popup v-model="showWorkStartTime" position="bottom">
  136. <van-datetime-picker
  137. v-model="startTime"
  138. type="time"
  139. @confirm="confirmWorkTime(0);"
  140. @cancel="showWorkStartTime = false"
  141. :min-hour="0"
  142. :max-hour="23"
  143. />
  144. <!-- :filter="filter" 原本这个属性在里面 -->
  145. </van-popup>
  146. <van-popup v-model="showWorkEndTime" position="bottom" >
  147. <van-datetime-picker
  148. v-model="endTime"
  149. type="time"
  150. :min-hour="0"
  151. :max-hour="23"
  152. @confirm="confirmWorkTime(1)"
  153. @cancel="showWorkEndTime = false"
  154. />
  155. <!-- :filter="filter" 原本这个属性在里面 -->
  156. </van-popup>
  157. </div>
  158. <div style="width:100%;" v-if="canEdit&&reportTimeType.multiWorktime==1">
  159. <van-tag style="text-align:center;padding:5px;margin-left:15px;border: 1px solid #20a0ff;"
  160. :disabled="!canEdit" @click="addNewWorktime(index, item)"
  161. icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 5px;"> 添加工时 </span></van-tag>
  162. </div>
  163. <div class="overtime" >
  164. <van-checkbox :disabled="!canEdit" v-model="item.isOvertime" v-if="reportTimeType.multiWorktime !=1">加班</van-checkbox>
  165. <van-tag style="position:absolute;right:10px;" v-if="isCorpWX&&canEdit" type="primary" size="large" @click="takePhoto(index)">拍照上传</van-tag>
  166. </div>
  167. <div style="padding:5px;text-align:center;" v-if="!isIOSystem">
  168. <span v-for="(p, index) in item.pics" :key="p" style="margin-right:15px;">
  169. <div class="imgList">
  170. <van-icon v-if="canEdit && user.companyId==7" size="20" name="clear" @click="deleteImg(item, index)" class="imgList_i"/>
  171. <img :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.pics, index)"/>
  172. </div>
  173. </span>
  174. </div>
  175. <div style="padding:5px;text-align:center;" v-if="isIOSystem">
  176. <span v-for="(p, index) in item.iospics" :key="p" style="margin-right:15px;">
  177. <div class="imgList">
  178. <van-icon v-if="canEdit && user.companyId==7" size="20" name="clear" @click="deleteImg(item, index)" class="imgList_i"/>
  179. <img :src="p" style="width:100px; height:100px;" @click="showLargeImg(item.iospics, index)"/>
  180. </div>
  181. </span>
  182. </div>
  183. <van-popup v-model="imgShow" position="bottom" closeable >
  184. <van-swipe class="my-swipe" indicator-color="white">
  185. <van-swipe-item v-for="(picItem, index) in tmpPics" :key="index">
  186. <img :src="picItem" style="width:100%;" />
  187. </van-swipe-item>
  188. </van-swipe>
  189. </van-popup>
  190. </van-cell-group>
  191. </div>
  192. <div style="text-align:center;" >
  193. <van-tag v-if="canEdit" size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
  194. :disabled="!canEdit" @click="addNewPro"
  195. icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增项目 </span></van-tag>
  196. </div>
  197. <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
  198. <div style="padding-bottom:10px;">
  199. <van-button v-if="canEdit" square block type="info" @click="isDraft=0" native-type="submit" style="width:50%;float:left;"> 提交 </van-button>
  200. <van-button v-if="canEdit" square block type="default" @click="isDraft=1" native-type="submit" style="width:50%;float:left;"> 暂存 </van-button>
  201. </div>
  202. <van-button v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null"
  203. square block type="default" @click="deleteReport" native-type="button"
  204. style=""> 删除 </van-button>
  205. <!-- <div v-if="canEdit&&form.domains.length>0 && form.domains[0].id != null"
  206. style="display:block;padding-top:30px;font-size:15px;color:#666;margin:0 auto;text-align:center;padding-bottom:10px;background:#ffffff;"
  207. @click="deleteReport"> 删除 </div> -->
  208. <!-- <van-button v-if="canEdit" square block type="default" @click="deleteReport" native-type="button"
  209. style="margin-top:10px;"> 删除 </van-button> -->
  210. </div>
  211. </van-form>
  212. <div style="position:fixed; bottom:0px;width:100%;">
  213. <van-button v-if="canCancel" block type="default" @click="cancel"> 撤销 </van-button>
  214. </div>
  215. <div class="form_tip" v-if="!canEdit && !canCancel"> 已审核无法修改 </div>
  216. <!-- 选择项目弹窗 -->
  217. <van-popup v-model="showPickerUserddp" position="bottom" style="height: 80%">
  218. <!-- <van-search v-model="userName" placeholder="输入项目名称搜索" @clear="sea()" @blur="sea()" @search="sea()"></van-search> -->
  219. <van-search v-model="userName" placeholder="请输入项目名称" @clear="sea()" @blur="sea()" @search="sea()"/>
  220. <div style="minHeight:300px;">
  221. <div v-for="item in projectss" :key="item.id" class="ryuan" @click="fZr(item)">{{item.projectName}}</div>
  222. </div>
  223. </van-popup>
  224. </div>
  225. </template>
  226. <script src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
  227. <script>
  228. import wx from 'weixin-js-sdk'
  229. // Vue.prototype.$wx = wx
  230. export default {
  231. data() {
  232. return {
  233. isDraft:0,
  234. showWorkStartTime:false,
  235. showWorkEndTime:false,
  236. curWorktime:null,
  237. isIOSystem:false,
  238. imgShow: false,
  239. isCorpWX:false,
  240. isWX: false,
  241. showPickerTask:false,
  242. canCancel:false,
  243. canEdit:false,
  244. showEndTime: false,
  245. showStartTime: false,
  246. startTime:'09:00',
  247. endTime: '18:00',
  248. nowTime:new Date(),
  249. showPickerHours: false,
  250. timeRange:[0.5,1.0,1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,10.5,11.0,11.5,12.5,13.0,13.5,14.0,14.5,15.0],
  251. selectTime:null,
  252. reportTimeType:{},
  253. user: JSON.parse(localStorage.userInfo),
  254. minDate: new Date(2010, 0, 1),
  255. maxDate: new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()+7),
  256. currentDate: new Date(),
  257. showPickerTime: false,
  258. showPicker: false,
  259. showPickerProject: false,
  260. showPickerProjects: false,
  261. clickIndex: 0,
  262. clickTimeIndex: 0,
  263. showNumberKey: false,
  264. canClick: 2,
  265. timeType:[],
  266. form: {
  267. createDate: this.format(new Date(new Date()),"yyyy-MM-dd"),
  268. domains: [{
  269. id: null,
  270. projectId: "",
  271. projectName: "",
  272. workingTime: "",
  273. content: "",
  274. state: 2,
  275. multiWorktime:0,
  276. worktimeList:{},
  277. degreeId: ''
  278. // pics:["https://worktime.ttkuaiban.com/upload/bc4df504fa724e6cab69872e2c1cfb35.png",
  279. // "https://worktime.ttkuaiban.com/upload/bc4df504fa724e6cab69872e2c1cfb35.png",
  280. // "https://worktime.ttkuaiban.com/upload/bc4df504fa724e6cab69872e2c1cfb35.png",]
  281. }],
  282. },
  283. rules: {
  284. createDate: [{ required: true, message: '请选择填报日期' }],
  285. },
  286. project: [],
  287. report: "",
  288. loading: false,
  289. finished: false,
  290. // isOvertime: false
  291. tmpPics:[],
  292. dateAr: [],
  293. showPickerUserddp: false, // 选择项目弹窗
  294. projectss: [],
  295. proads: [],
  296. userName: '',
  297. proIdx: ''
  298. };
  299. },
  300. created() {
  301. },
  302. methods: {
  303. // 获取项目
  304. getPeoject() {
  305. this.$axios.post("/project/getProjectList", {})
  306. .then(res => {
  307. if(res.code == "ok") {
  308. this.projectss = res.data;
  309. this.proads = res.data
  310. } else {
  311. this.$toast.fail('获取失败:'+res.msg);
  312. }
  313. }).catch(err=> {toast.clear();});
  314. },
  315. sea() {
  316. console.log(this.userName.length)
  317. if(this.userName.length > 0) {
  318. console.log(123)
  319. let text = this.userName
  320. let reg = new RegExp(text)
  321. let data = this.projectss.filter(item => reg.test(item.projectName)) //返回
  322. this.projectss = data
  323. } else {
  324. console.log(456)
  325. this.project = this.proads
  326. }
  327. },
  328. fZr(item) {
  329. console.log(item, '你看看')
  330. this.form.domains[this.proIdx].projectId = item.id
  331. this.form.domains[this.proIdx].projectName = item.projectName
  332. this.showPickerUserddp = false
  333. },
  334. showEndDialog(timeItem) {
  335. this.curWorktime = timeItem;
  336. this.showWorkEndTime = true;
  337. },
  338. showStartDialog(timeItem) {
  339. this.curWorktime = timeItem;
  340. this.showWorkStartTime = true;
  341. },
  342. removeTimeItem(item, index) {
  343. item.worktimeList.splice(index, 1);
  344. },
  345. isIOS(){
  346. var u = navigator.userAgent;
  347. var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
  348. return isiOS;
  349. },
  350. showLargeImg(item, index) {
  351. this.imgShow = true;
  352. this.tmpPics = item;
  353. },
  354. //拍照上传
  355. takePhoto(index) {
  356. var that = this;
  357. wx.chooseImage({
  358. count: 9, // 默认9
  359. sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
  360. sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
  361. defaultCameraMode: "batch", //表示进入拍照界面的默认模式,目前有normal与batch两种选择,normal表示普通单拍模式,batch表示连拍模式,不传该参数则为normal模式。从3.0.26版本开始支持front和batch_front两种值,其中front表示默认为前置摄像头单拍模式,batch_front表示默认为前置摄像头连拍模式。(注:用户进入拍照界面仍然可自由切换两种模式)
  362. isSaveToAlbum: 0, //整型值,0表示拍照时不保存到系统相册,1表示自动保存,默认值是1
  363. success: function (res) {
  364. var localIds = res.localIds; // 返回选定照片的本地ID列表,
  365. // andriod中localId可以作为img标签的src属性显示图片;
  366. // iOS应当使用 getLocalImgData 获取图片base64数据,从而用于img标签的显示(在img标签内使用 wx.chooseImage 的 localid 显示可能会不成功)
  367. if (that.form.domains[index].pics == null) {
  368. that.form.domains[index].pics = [];
  369. that.form.domains[index].iospics = [];
  370. }
  371. if (that.isIOSystem) {
  372. for (var i=0;i<localIds.length; i++) {
  373. wx.getLocalImgData({
  374. localId: localIds[i], // 图片的localID
  375. success: function (res) {
  376. var localData = res.localData; // localData是图片的base64数据,可以用img标签显示
  377. that.form.domains[index].iospics.push(localData);
  378. that.$forceUpdate();
  379. }
  380. });
  381. }
  382. if (that.user.companyId == 7) {
  383. that.form.domains[index].pics = that.form.domains[index].pics.concat(localIds);
  384. } else {
  385. that.form.domains[index].pics = localIds;
  386. }
  387. } else {
  388. if (that.user.companyId == 7) {
  389. that.form.domains[index].pics = that.form.domains[index].pics.concat(localIds);
  390. } else {
  391. that.form.domains[index].pics = localIds;
  392. }
  393. that.$forceUpdate();
  394. }
  395. // var serverIdList = [];
  396. if (that.form.domains[index].serverPics == null) {
  397. that.form.domains[index].serverPics = [];
  398. }
  399. //立即就上传到企业微信服务器
  400. for (var i=0;i<localIds.length; i++) {
  401. wx.uploadImage({
  402. localId: localIds[i], // 需要上传的图片的本地ID,由chooseImage接口获得
  403. isShowProgressTips: 1, // 默认为1,显示进度提示
  404. success: function (res) {
  405. var serverId = res.serverId; // 返回图片的服务器端ID
  406. // serverIdList.push(serverId);
  407. that.form.domains[index].serverPics.push(serverId);
  408. }
  409. });
  410. }
  411. }
  412. });
  413. },
  414. copyProject(index) {
  415. var leftProgress = 10;
  416. if (this.reportTimeType.type == 3) {
  417. //计算已经待分配工时比例
  418. let array = this.form.domains;
  419. let totalProgress = 0;
  420. for (var i=0;i<array.length; i++) {
  421. totalProgress += array[i].progress;
  422. }
  423. if (totalProgress < 100) {
  424. leftProgress = 100 - totalProgress;
  425. }
  426. }
  427. var newIndex = index+1;
  428. var pName = "";
  429. if (this.form.domains[index].projectId != '') {
  430. pName = this.project.filter(p=>p.id == this.form.domains[index].projectId)[0].projectName;
  431. }
  432. var itemDomain = {
  433. id: null,
  434. projectId: this.form.domains[index].projectId,
  435. projectName: pName,
  436. workingTime: this.reportTimeType.type==3?(leftProgress*this.reportTimeType.allday/100).toFixed(1):"",
  437. progress:leftProgress,
  438. content: "",
  439. state: 2,
  440. isOvertime:false,
  441. };
  442. this.form.domains.splice(newIndex, 0,itemDomain);
  443. },
  444. //删除日报
  445. deleteReport() {
  446. this.$dialog.confirm({
  447. title: '删除日报',
  448. message: '确定要删除当天日报吗?'
  449. }).then(() => {
  450. const toast = this.$toast.loading({
  451. forbidClick: true,
  452. duration: 0
  453. });
  454. this.$axios.post("/report/delete", {userId: this.user.id, date:this.form.createDate})
  455. .then(res => {
  456. if(res.code == "ok") {
  457. toast.clear();
  458. this.$toast.success('删除成功');
  459. window.location.reload();
  460. } else {
  461. toast.clear();
  462. this.$toast.fail('删除失败');
  463. }
  464. }).catch(err=> {toast.clear();});
  465. }).catch(() => {});
  466. },
  467. changeAllTime() {
  468. //总时长发生改变,自动按比例计算
  469. this.form.domains.forEach(d=>{
  470. d.workingTime = (d.progress*this.reportTimeType.allday/100).toFixed(1);
  471. });
  472. },
  473. cancel() {
  474. const toast = this.$toast.loading({
  475. forbidClick: true,
  476. duration: 0
  477. });
  478. var ids = '';
  479. var data = this.form.domains;
  480. data.forEach(element => {
  481. if (element.id != null && element.id != '') {
  482. ids +=(element.id+',');
  483. }
  484. });
  485. this.$axios.post("/report/cancel", {userId: this.user.id, reportIds:ids})
  486. .then(res => {
  487. if(res.code == "ok") {
  488. toast.clear();
  489. this.$toast.success('撤销成功');
  490. this.getReport();
  491. } else {
  492. toast.clear();
  493. this.$toast.fail('获取失败');
  494. }
  495. }).catch(err=> {toast.clear();});
  496. },
  497. confirmWorkTime(field) {
  498. if (field == 0) {
  499. this.curWorktime.startTime = this.startTime;
  500. this.showWorkStartTime = false;
  501. } else {
  502. this.curWorktime.endTime = this.endTime;
  503. this.showWorkEndTime = false;
  504. }
  505. },
  506. confirmTime(item, field) {
  507. if (field == 0) {
  508. item.startTime = this.startTime;
  509. this.showStartTime = false;
  510. } else {
  511. item.endTime = this.endTime;
  512. this.showEndTime = false;
  513. }
  514. },
  515. filter(type, options) {
  516. if (type === 'minute') {
  517. return options.filter(option => option % 30 === 0);
  518. }
  519. return options;
  520. },
  521. choseTimePick(value, index) {
  522. //选中时间
  523. if (this.reportTimeType.type == 0) {
  524. this.form.domains[this.clickTimeIndex].timeType = value.value;
  525. this.form.domains[this.clickTimeIndex].workingTime = value.hours;
  526. this.form.domains[this.clickTimeIndex].label = value.label;
  527. this.showPickerTime = false;
  528. } else if (this.reportTimeType.type == 1) {
  529. console.log('this.reportTimeType.type=='+value);
  530. this.form.domains[this.clickTimeIndex].workingTime = value;
  531. this.form.domains[this.clickTimeIndex].label = value.toFixed(1)+'小时';
  532. this.showPickerHours = false;
  533. }
  534. },
  535. clickTimePicker(i) {
  536. if (!this.canEdit) {
  537. return;
  538. }
  539. this.clickTimeIndex = i;
  540. if (this.reportTimeType.type == 0) {
  541. this.showPickerTime = true;
  542. } else if (this.reportTimeType.type == 1) {
  543. this.showPickerHours = true;
  544. }
  545. },
  546. getTimeType() {
  547. this.$axios.post('/time-type/getCompanyTimeSetting', { companyId: this.user.companyId})
  548. .then(res => {
  549. if(res.code == "ok") {
  550. var t = res.data;
  551. this.reportTimeType = t;
  552. //转化时间格式
  553. if (t.allday != null) {
  554. this.timeType.push({value:0, label:'全天 - '+t.allday+'小时', hours:t.allday});
  555. }
  556. if (t.am != null) {
  557. this.timeType.push({value:1, label:'上午 - '+t.am+'小时', hours: t.am});
  558. }
  559. if (t.pm != null) {
  560. this.timeType.push({value:2, label:'下午 - '+t.pm+'小时', hours: t.pm});
  561. }
  562. } else {
  563. toast.clear();
  564. this.$toast.fail(res.msg);
  565. }
  566. }).catch(err=> {toast.clear();});
  567. },
  568. // 返回
  569. back() {
  570. history.back();
  571. },
  572. // 时间转换
  573. format(date, pattern) {
  574. pattern = pattern || "yyyy-MM-dd";
  575. var _this = this;
  576. return pattern.replace(/([yMdhsm])(\1*)/g, function ($0) {
  577. switch ($0.charAt(0)) {
  578. case 'y': return _this.padding(date.getFullYear(), $0.length);
  579. case 'M': return _this.padding(date.getMonth() + 1, $0.length);
  580. case 'd': return _this.padding(date.getDate(), $0.length);
  581. case 'w': return date.getDay() + 1;
  582. case 'h': return _this.padding(date.getHours(), $0.length);
  583. case 'm': return _this.padding(date.getMinutes(), $0.length);
  584. case 's': return _this.padding(date.getSeconds(), $0.length);
  585. }
  586. });
  587. },
  588. padding(s, len) {
  589. var len = len - (s + '').length;
  590. for (var i = 0; i < len; i++) { s = '0' + s; }
  591. return s;
  592. },
  593. // 获取项目
  594. getProject() {
  595. const toast = this.$toast.loading({
  596. forbidClick: true,
  597. duration: 0
  598. });
  599. this.$axios.post("/project/getProjectList", {})
  600. .then(res => {
  601. if(res.code == "ok") {
  602. toast.clear();
  603. this.project = res.data;
  604. // if (this.project.length > 0) {
  605. // console.log('this.project[0].id=='+this.project[0].id);
  606. // this.getTaskList(this.project[0].id);
  607. // }
  608. } else {
  609. toast.clear();
  610. this.$toast.fail('获取失败:'+res.msg);
  611. }
  612. }).catch(err=> {toast.clear();});
  613. },
  614. // 获取日报
  615. getReport() {
  616. const toast = this.$toast.loading({
  617. forbidClick: true,
  618. duration: 0
  619. });
  620. this.$axios.post("/report/getReport", {date: this.form.createDate})
  621. .then(res => {
  622. if(res.code == "ok") {
  623. toast.clear();
  624. this.report = res.data;
  625. var t = res.data.timeType;
  626. var timeType=[];
  627. //转化时间格式
  628. if (t.allday != null) {
  629. timeType.push({value:0, label:'全天 - '+t.allday+'小时', hours:t.allday});
  630. }
  631. if (t.am != null) {
  632. timeType.push({value:1, label:'上午 - '+t.am+'小时', hours: t.am});
  633. }
  634. if (t.pm != null) {
  635. timeType.push({value:2, label:'下午 - '+t.pm+'小时', hours: t.pm});
  636. }
  637. var list = res.data.report;
  638. if(list.length != 0) {
  639. this.canEdit = false;
  640. this.canCancel = false;
  641. let array = [];
  642. for(var i in list) {
  643. var projectName = "";
  644. var flg = (list[i].isOvertime == 1);
  645. for(var j in this.project) {
  646. if(this.project[j].id == list[i].projectId) {
  647. projectName = this.project[j].projectName;
  648. }
  649. }
  650. let tname = '';
  651. if (list[i].taskId != null && list[i].taskList.length > 0) {
  652. let filterList = list[i].taskList.filter(t=>t.taskId == list[i].taskId);
  653. if (filterList.length > 0) {
  654. tname = filterList[0].taskName;
  655. }
  656. }
  657. let mmm = list[i].degreeId
  658. let sss = list[i].degreeList
  659. let wuduName = ''
  660. for (var s in sss) {
  661. if(sss[s].id == mmm) {
  662. wuduName = sss[s].name
  663. }
  664. }
  665. let serverPicArray = [];
  666. console.log('picArray=='+list[i].picStr);
  667. if (list[i].picStr != null && list[i].picStr != '@') {
  668. serverPicArray = JSON.parse(list[i].picStr.replace(/@/g,","));
  669. }
  670. array.push({
  671. id: list[i].id,
  672. projectId: list[i].projectId,
  673. projectName: projectName,
  674. workingTime: String(list[i].workingTime),
  675. content: list[i].content,
  676. state: list[i].state,
  677. timeType: list[i].timeType,
  678. label: timeType[list[i].timeType].label,
  679. startTime: list[i].startTime,
  680. endTime: list[i].endTime,
  681. isOvertime: flg,
  682. progress: list[i].progress,
  683. taskList: list[i].taskList,
  684. taskId: list[i].taskId,
  685. taskName:tname,
  686. professionProgress:list[i].professionProgressList,
  687. pics: list[i].pics,
  688. iospics:list[i].pics,
  689. serverPics:serverPicArray,
  690. multiWorktime:t.multiWorktime,
  691. worktimeList:list[i].worktimeList,
  692. wuduList: list[i].degreeList,
  693. weiduName: wuduName,
  694. degreeId: list[i].degreeId
  695. })
  696. if (list[i].state >= 2) {
  697. this.canEdit = true;
  698. } else if (list[i].state == 0) {
  699. this.canCancel = true;
  700. }
  701. }
  702. this.form.domains = array;
  703. } else {
  704. this.canCancel = false;
  705. this.canEdit = true;
  706. //没有填报的可以点击提交
  707. this.form.domains = [{
  708. id: null,
  709. projectId: "",
  710. projectName: "",
  711. workingTime: t.type==3?(t.allday).toFixed(1):"8.0",
  712. content: "",
  713. state: 2,
  714. progress:100,
  715. isOvertime:false,
  716. professionProgress:[],
  717. multiWorktime:t.multiWorktime,
  718. worktimeList:[{}],
  719. }]
  720. this.canEdit = true;
  721. }
  722. } else {
  723. toast.clear();
  724. this.$toast.fail('获取失败:'+res.msg);
  725. }
  726. if(localStorage.getItem("formVal")) {
  727. console.log('触发了')
  728. var obj = localStorage.getItem("formVal")
  729. this.form = JSON.parse(obj)
  730. localStorage.removeItem('formVal')
  731. }
  732. }).catch(err=> {toast.clear();});
  733. },
  734. // 改变时间
  735. changeTime(time) {
  736. this.form.createDate = this.format(new Date(time),"yyyy-MM-dd");
  737. this.currentDate = time;
  738. this.showPicker = false;
  739. this.getReport();
  740. },
  741. // 选择项目
  742. clickPicker(i, item) {
  743. if (!this.canEdit) return;
  744. // this.clickIndex = i;
  745. // this.showPickerProject = true;
  746. console.log(i, item, this.form)
  747. this.proIdx = i
  748. this.showPickerUserddp = true
  749. // this.$router.push({
  750. // path: '/search',
  751. // query: {
  752. // // from: JSON.stringify(this.form)
  753. // from: this.form,
  754. // idx: i
  755. // }
  756. // });
  757. },
  758. clickPickers(i) {
  759. if (!this.canEdit) return;
  760. this.clickIndex = i;
  761. this.showPickerProjects = true;
  762. var proId = this.form.domains[this.clickIndex].projectId
  763. this.dimension(proId)
  764. },
  765. //选择任务
  766. clickPickerTask(i) {
  767. if (!this.canEdit) return;
  768. this.clickIndex = i;
  769. var proId = this.form.domains[this.clickIndex].projectId
  770. this.getTaskList(proId)
  771. this.showPickerTask = true;
  772. },
  773. choseTask(value, index) {
  774. this.form.domains[this.clickIndex].taskId = value.taskId;
  775. this.form.domains[this.clickIndex].taskName = value.taskName;
  776. this.showPickerTask = false;
  777. },
  778. choseProjects(value, index) {
  779. // console.log(value)
  780. this.form.domains[this.clickIndex].weiduName = value.name;
  781. this.form.domains[this.clickIndex].degreeId = value.id;
  782. this.showPickerProjects = false;
  783. },
  784. choseProject(value, index) {
  785. this.form.domains[this.clickIndex].projectId = value.id;
  786. this.form.domains[this.clickIndex].projectName = value.projectName;
  787. this.showPickerProject = false;
  788. this.getTaskList(value.id);
  789. this.dimension(value.id) // 获取维度
  790. //加载项目相关的工程进度
  791. if (this.user.company.packageEngineering == 1) {
  792. this.getProjectProfessions(this.form.domains[this.clickIndex], index);
  793. }
  794. },
  795. getProjectProfessions(domain, index) {
  796. this.$axios.post("/project-profession/getMyProfession", {projectId: domain.projectId})
  797. .then(res => {
  798. if(res.code == "ok") {
  799. this.form.domains[this.clickIndex].professionProgress = res.data;
  800. this.$forceUpdate();
  801. } else {
  802. this.$toast.fail('获取失败');
  803. }
  804. }).catch(err=> {toast.clear();});
  805. },
  806. // 获取维度
  807. dimension(projectId) {
  808. this.$axios.post("/project/getDegreeList", {projectId: projectId})
  809. .then(res => {
  810. if(res.code == "ok") {
  811. this.form.domains[this.clickIndex].wuduList = res.data;
  812. this.$forceUpdate();
  813. } else {
  814. this.$toast.fail('获取失败');
  815. }
  816. }).catch(err=> {toast.clear();});
  817. },
  818. getTaskList(projectId) {
  819. //如果是专业版,需要列出任务列表
  820. if (this.user.company.packageProject == 1) {
  821. this.$axios.post("/task/getRecentTask", {projectId: projectId})
  822. .then(res => {
  823. if(res.code == "ok") {
  824. this.form.domains[this.clickIndex].taskList = res.data;
  825. this.$forceUpdate();
  826. } else {
  827. this.$toast.fail('获取失败');
  828. }
  829. }).catch(err=> {toast.clear();});
  830. }
  831. },
  832. //添加工时
  833. addNewWorktime(index, item) {
  834. item.worktimeList.push({});
  835. },
  836. // 添加项目
  837. addNewPro() {
  838. var leftProgress = 10;
  839. if (this.reportTimeType.type == 3) {
  840. //计算已经待分配工时比例
  841. let array = this.form.domains;
  842. let totalProgress = 0;
  843. for (var i=0;i<array.length; i++) {
  844. totalProgress += array[i].progress;
  845. }
  846. if (totalProgress < 100) {
  847. leftProgress = 100 - totalProgress;
  848. }
  849. }
  850. this.form.domains.push({
  851. id: null,
  852. projectId: "",
  853. projectName: "",
  854. workingTime: this.reportTimeType.type==3?(leftProgress*this.reportTimeType.allday/100).toFixed(1):"4.0",
  855. progress:leftProgress,
  856. content: "",
  857. state: 2,
  858. isOvertime:false,
  859. multiWorktime: this.reportTimeType.multiWorktime,
  860. worktimeList:[{}],
  861. degreeId: null
  862. })
  863. },
  864. // 移除项目
  865. delPro(i) {
  866. this.$dialog.confirm({
  867. title: '',
  868. message: '是否移除当前项目'
  869. }).then(() => {
  870. this.form.domains.splice(i,1);
  871. }).catch(() => {
  872. });
  873. },
  874. // 判断时间段
  875. fns() {
  876. for (let k in this.dateAr) {
  877. if (!this.judege(k)) {
  878. return false
  879. }
  880. }
  881. return true
  882. },
  883. judege(idx){
  884. for (let k in this.dateAr) {
  885. if (idx !== k) {
  886. if (this.dateAr[k].s <= this.dateAr[idx].s && this.dateAr[k].e > this.dateAr[idx].s) {
  887. return false
  888. }
  889. if (this.dateAr[k].s < this.dateAr[idx].e && this.dateAr[k].e >= this.dateAr[idx].e) {
  890. return false
  891. }
  892. }
  893. }
  894. return true
  895. },
  896. // 提交日报
  897. register() {
  898. this.dateAr = []
  899. let alp = []
  900. if(this.user.timeType.multiWorktime == 1) {
  901. for(var p in this.form.domains) {
  902. var slll = this.form.domains[p]
  903. for(var o in slll.worktimeList) {
  904. if(slll.worktimeList[o].startTime || slll.worktimeList[o].endTime) {
  905. let objs = {}
  906. objs.s = slll.worktimeList[o].startTime
  907. objs.e = slll.worktimeList[o].endTime
  908. alp.push(objs)
  909. }
  910. }
  911. }
  912. this.dateAr = alp
  913. if(this.dateAr.length > 0) {
  914. let trus = this.fns()
  915. if(!trus) {
  916. this.$toast('填写的时间段重叠')
  917. return
  918. }
  919. }
  920. }
  921. // return
  922. const toast = this.$toast.loading({
  923. forbidClick: true,
  924. duration: 0
  925. });
  926. let formData = new FormData();
  927. formData.append("draft", this.isDraft);
  928. if (this.reportTimeType.type == 0) {
  929. var alldayNum = 0;
  930. var amNum = 0;
  931. var pmNum = 0;
  932. for(var i in this.form.domains) {
  933. if (this.form.domains[i].timeType == 0) {
  934. alldayNum ++;
  935. } else if (this.form.domains[i].timeType == 1) {
  936. amNum++;
  937. } else if (this.form.domains[i].timeType == 2) {
  938. pmNum++;
  939. }
  940. }
  941. if (alldayNum > 1) {
  942. this.$toast.fail("工作时间-全天,只能选择一次");
  943. return;
  944. }
  945. if (amNum > 1) {
  946. this.$toast.fail("工作时间-上午,只能选择一次");
  947. return;
  948. }
  949. if (pmNum > 1) {
  950. this.$toast.fail("工作时间-下午,只能选择一次");
  951. return;
  952. }
  953. if (alldayNum == 1 && (amNum > 0 || pmNum > 0)) {
  954. this.$toast.fail("工作时间-全天,不能和上下午同时存在");
  955. return;
  956. }
  957. } else if (this.reportTimeType.type == 3) {
  958. //总百分比不能超过100%
  959. let total = 0;
  960. this.form.domains.forEach(w=>{total += w.progress});
  961. if (total > 100) {
  962. this.$toast.fail("用时比例之和不能超过100%");
  963. return;
  964. } else if (total < 100) {
  965. this.$toast.fail("工时尚未完全分配,无法提交");
  966. return;
  967. }
  968. }
  969. //填字段
  970. for(var i in this.form.domains) {
  971. if (this.user.timeType.customDegreeActive == 1) {
  972. if(this.form.domains[i].degreeId) {
  973. formData.append("degreeId", this.form.domains[i].degreeId);
  974. } else {
  975. formData.append("degreeId", -1);
  976. }
  977. }
  978. if (this.form.domains[i].id != null) {
  979. formData.append("id", this.form.domains[i].id);
  980. } else {
  981. formData.append("id", -1);
  982. }
  983. formData.append("projectId", parseFloat(this.form.domains[i].projectId));
  984. if (this.form.domains[i].subProjectId != null) {
  985. formData.append("subProjectId", this.form.domains[i].subProjectId);
  986. } else {
  987. formData.append("subProjectId", 0);
  988. }
  989. formData.append("reportTimeType", this.reportTimeType.type);
  990. formData.append("multiWorktime", this.reportTimeType.multiWorktime);
  991. if (this.reportTimeType.type == 0) {
  992. formData.append("timeType", this.form.domains[i].timeType);
  993. formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
  994. } else if (this.reportTimeType.type == 1) {
  995. formData.append("workingTime", parseFloat(this.form.domains[i].workingTime));
  996. } else if (this.reportTimeType.type == 2) {
  997. formData.append("startTime", this.form.domains[i].startTime);
  998. formData.append("endTime",this.form.domains[i].endTime);
  999. } else if (this.reportTimeType.type == 3) {
  1000. formData.append("progress", this.form.domains[i].progress);
  1001. formData.append("workingTime",this.form.domains[i].workingTime);
  1002. }
  1003. if (this.form.domains[i].taskId == null) {
  1004. formData.append("taskId", 0);
  1005. } else {
  1006. formData.append("taskId", this.form.domains[i].taskId);
  1007. }
  1008. formData.append("createDate", this.form.createDate);
  1009. formData.append("isOvertime", this.form.domains[i].isOvertime?1:0);
  1010. //项目专业进度
  1011. if (this.form.domains[i].professionProgress != null) {
  1012. let m = JSON.stringify(this.form.domains[i].professionProgress);
  1013. m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
  1014. formData.append("professionProgress", m);
  1015. } else {
  1016. formData.append("professionProgress", "[]");
  1017. }
  1018. //图片的处理,serverPic是当前所有的照片
  1019. if (this.form.domains[i].serverPics!= null && this.form.domains[i].serverPics.length > 0) {
  1020. let m = JSON.stringify(this.form.domains[i].serverPics);
  1021. m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
  1022. formData.append("pics", m);
  1023. } else {
  1024. formData.append("pics", "@");
  1025. }
  1026. //处理多个时间事项
  1027. if (this.reportTimeType.multiWorktime == 1) {
  1028. //检查时间是否有重叠
  1029. var workList = this.form.domains[i].worktimeList;
  1030. for (var j=0;j<workList.length; j++) {
  1031. var curItem = workList[j];
  1032. if (curItem.startTime == null || curItem.endTime == null) {
  1033. this.$toast.fail("请设置工作时间");
  1034. return;
  1035. }
  1036. //检查开始时间是否大于结束时间
  1037. if (curItem.startTime >= curItem.endTime) {
  1038. this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"有误:"+
  1039. "结束时间必须大于开始时间");
  1040. return;
  1041. }
  1042. for (var p = j+1;p<workList.length; p++) {
  1043. var jItem = workList[p];
  1044. if ((jItem.startTime>=curItem.startTime&&jItem.startTime < curItem.endTime)
  1045. || (jItem.endTime>curItem.startTime&&jItem.endTime <= curItem.endTime)) {
  1046. this.$toast.fail("时间段"+curItem.startTime+'-'+curItem.endTime+"与"+
  1047. jItem.startTime+'-'+jItem.endTime+ "存在重叠,请修改。");
  1048. return;
  1049. }
  1050. }
  1051. }
  1052. let m = JSON.stringify(this.form.domains[i].worktimeList);
  1053. m = m.replace(/,/g,"@");//replaceAll(',','@');企业微信不兼容replaceAll
  1054. formData.append("content", m);
  1055. } else {
  1056. if (this.form.domains[i].content == null || this.form.domains[i].content == '') {
  1057. formData.append("content", '-');
  1058. } else {
  1059. formData.append("content", this.form.domains[i].content);
  1060. }
  1061. }
  1062. }
  1063. this.$axios.post("/report/editReport", formData)
  1064. .then(res => {
  1065. if(res.code == "ok") {
  1066. toast.clear();
  1067. this.$toast.success(this.isDraft==0?'提交成功':'暂存成功');
  1068. if (this.isDraft==0) {
  1069. this.$router.push("/index");
  1070. }
  1071. } else {
  1072. toast.clear();
  1073. this.$toast.fail((this.isDraft==0?'提交失败':'暂存成功')+':'+res.msg);
  1074. }
  1075. }).catch(err=> {toast.clear();});
  1076. },
  1077. //初始化参数
  1078. initWxConfig() {
  1079. var curUrl=location.href.split("#")[0];
  1080. this.$axios.post("/wxcorp/getCorpWXConfig", {url: curUrl, token: this.user.id})
  1081. .then(res => {
  1082. if(res.code == "ok") {
  1083. var data=res.data;
  1084. wx.config({
  1085. beta: true,
  1086. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  1087. appId: data.appid, // 必填,公众号的唯一标识
  1088. timestamp: data.timestamp, // 必填,生成签名的时间戳
  1089. nonceStr: data.noncestr, // 必填,生成签名的随机串
  1090. signature: data.sign, // 必填,签名,见附录1
  1091. jsApiList: [
  1092. 'chooseImage',
  1093. 'previewImage',
  1094. 'uploadImage',
  1095. 'downloadImage',
  1096. 'previewFile',
  1097. 'getLocation',
  1098. ]
  1099. });
  1100. wx.ready(function(){
  1101. // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
  1102. console.log('企业微信初始化执行成功了。 ');
  1103. });
  1104. } else {
  1105. this.$toast.fail('获取失败');
  1106. }
  1107. }).catch(err=> {this.$toast.fail('发生异常'+err);console.log(err)});
  1108. },
  1109. deleteImg(item, index) {
  1110. //删除添加的图片
  1111. if (this.isIOSystem) {
  1112. item.iospics.splice(index,1);
  1113. item.iospics = item.iospics;
  1114. }
  1115. item.pics.splice(index,1);
  1116. item.pics = item.pics;
  1117. //传递到后台的数据也要做同步删除
  1118. item.serverPics.splice(index,1);
  1119. this.$forceUpdate();
  1120. }
  1121. },
  1122. mounted() {
  1123. console.log(localStorage.getItem("formVal"))
  1124. var ua = navigator.userAgent.toLowerCase();
  1125. this.isIOSystem = this.isIOS();
  1126. if (ua.indexOf("wxwork") > 0) {
  1127. this.isCorpWX = true;
  1128. } else if (ua.indexOf("micromessenger") > 0) {
  1129. this.isWX = true;
  1130. }
  1131. this.getPeoject() // 获取项目
  1132. //获取传递过来的日期
  1133. var passDate = this.$route.query.date;
  1134. if (passDate != null) {
  1135. this.form.createDate = this.$route.query.date;
  1136. }
  1137. this.getProject();
  1138. this.getReport();
  1139. this.getTimeType();
  1140. //初始化微信js-sdk参数
  1141. if (this.isCorpWX) {
  1142. this.initWxConfig();
  1143. }
  1144. // if(localStorage.getItem("formVal")) {
  1145. // var obj = localStorage.getItem("formVal")
  1146. // this.form = JSON.parse(obj)
  1147. // localStorage.removeItem('formVal')
  1148. // }
  1149. },
  1150. beforeDestroy() {
  1151. localStorage.removeItem('formVal')
  1152. }
  1153. };
  1154. </script>
  1155. <style lang="less" scope>
  1156. .my-swipe .van-swipe-item {
  1157. color: #fff;
  1158. font-size: 20px;
  1159. line-height: 150px;
  1160. text-align: center;
  1161. background-color: #39a9ed;
  1162. }
  1163. .van-field__control:disabled {
  1164. -webkit-text-fill-color:#646566;
  1165. }
  1166. .login_form {
  1167. margin-top: 46px;
  1168. }
  1169. .form_domains {
  1170. position: relative;
  1171. .form_copy {
  1172. position: absolute;
  1173. right: 85px;
  1174. top: 10px;
  1175. }
  1176. .form_addNew {
  1177. text-align: center;
  1178. margin:10px;
  1179. }
  1180. .form_del {
  1181. position: absolute;
  1182. right: 10px;
  1183. top: 10px;
  1184. }
  1185. // .form_del {
  1186. // color: #ff0000;
  1187. // font-size: 22px;
  1188. // position: absolute;
  1189. // right: 15px;
  1190. // top: 10px;
  1191. // }
  1192. }
  1193. .form_tip {
  1194. text-align: center;
  1195. margin-top: 20px;
  1196. color: #afafaf;
  1197. font-size: 14px;
  1198. }
  1199. .card__footer {
  1200. padding-top: 10px;
  1201. }
  1202. .card__tags {
  1203. .van-tag {
  1204. margin-right: 5px;
  1205. }
  1206. }
  1207. </style>
  1208. <style lang="less">
  1209. .van-nav-bar .van-icon , .van-nav-bar__text {
  1210. color: #20a0ff;
  1211. }
  1212. .overtime {
  1213. height: 50px;
  1214. box-sizing: border-box;
  1215. padding-left: 10px;
  1216. display: flex;
  1217. align-items: center;
  1218. }
  1219. .custom-button {
  1220. width: 40px;
  1221. color: #fff;
  1222. font-size: 10px;
  1223. line-height: 16px;
  1224. text-align: center;
  1225. background-color: #1989fa;
  1226. border-radius: 100px;
  1227. }
  1228. .imgList {
  1229. position: relative;
  1230. width: 100px;
  1231. height: 100px;
  1232. display: inline-block;
  1233. }
  1234. .imgList_i {
  1235. position: absolute;
  1236. top: -8px;
  1237. right: -6px;
  1238. z-index: 1;
  1239. }
  1240. .ryuan {
  1241. padding: 0 20px;
  1242. line-height: 40px;
  1243. height: 40px;
  1244. color: #333;
  1245. border-bottom: 2px solid #f6f6f6;
  1246. }
  1247. </style>