weekly.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <template>
  2. <div class="app-container">
  3. <el-form size="mini" :inline="true">
  4. <el-form-item label="关联会议">
  5. <el-select size="small" placeholder="关联会议" clearable filterable v-model="meetingWeek" @change="changeWeekData()">
  6. <el-option v-for="(item,index) in meetingData" :label="item.meetingName" :key="item.id" :value="item.weeks"></el-option>
  7. </el-select>
  8. </el-form-item>
  9. <el-form-item>
  10. <el-button type="primary" icon="el-icon-download" @click="generateWeekly()" v-show="false">周报生成</el-button>
  11. </el-form-item>
  12. </el-form>
  13. <div ref="exportPdf" id="exportPdf">
  14. <div>
  15. <h3>本周工作内容</h3>
  16. <el-table
  17. border
  18. stripe
  19. size="mini"
  20. style="width: 80%" v-model="workContents" :data="workContents"
  21. @row-click="rowClick" :span-method="objectSpanMethod" :highlight-current-row="true">
  22. <el-table-column label="分类" prop="classifyName" width="80">
  23. </el-table-column>
  24. <el-table-column label="项目" prop="projectName" width="120">
  25. </el-table-column>
  26. <el-table-column label="模块" prop="moduleName" width="150">
  27. </el-table-column>
  28. <el-table-column label="任务名称" prop="taskName" width="250">
  29. </el-table-column>
  30. <el-table-column label="工作反馈" prop="description">
  31. <template slot-scope="scope">
  32. <span v-if="scope.row.description!==''" v-for="(item,index) in scope.row.description.split(',') ">
  33. {{index+1}}.<span v-html="stripTags(item)"></span><br/>
  34. </span>
  35. </template>
  36. </el-table-column>
  37. <el-table-column label="最新进度" prop="scheduleValue" width="100">
  38. <template slot-scope="scope">
  39. {{scope.row.scheduleValue}}%
  40. </template>
  41. </el-table-column>
  42. </el-table>
  43. </div>
  44. <div>
  45. <h3>下周工作计划</h3>
  46. <el-table
  47. border
  48. stripe
  49. size="mini"
  50. style="width: 80%" :data="workPlans">
  51. <el-table-column type="index" label="序号" width="60">
  52. </el-table-column>
  53. <el-table-column label="工作计划" prop="workPlan">
  54. <template slot-scope="scope">
  55. <el-input size="mini" type="textarea" :autosize="{ minRows: 4, maxRows: 10}" v-model="scope.row.planContent" ></el-input>
  56. </template>
  57. </el-table-column>
  58. <el-table-column label="预计完成时间" prop="completionTimes">
  59. <template slot-scope="scope">
  60. <el-date-picker
  61. v-model="scope.row.completionTimes"
  62. type="date"
  63. size="mini"
  64. value-format="yyyy-MM-dd"
  65. format="yyyy-MM-dd"
  66. placeholder="选择日期">
  67. </el-date-picker>
  68. </template>
  69. </el-table-column>
  70. <el-table-column label="所属项目" prop="projectId">
  71. <template slot-scope="scope">
  72. <el-select v-model="scope.row.projectId" placeholder="请选择" size="mini">
  73. <el-option
  74. v-for="item in projects"
  75. :key="item.id"
  76. :label="item.projectName"
  77. :value="item.id">
  78. </el-option>
  79. </el-select>
  80. </template>
  81. </el-table-column>
  82. <el-table-column label="操作" prop="op" width="150" v-if="currentWeek===weeks">
  83. <template slot-scope="scope">
  84. <el-button size="mini" type="primary" @click="addRow()">添加</el-button>
  85. <el-button size="mini" type="danger" @click="deleteRow(scope.$index, scope.row)">删除</el-button>
  86. </template>
  87. </el-table-column>
  88. </el-table>
  89. </div>
  90. </div>
  91. <div style="margin-top: 50px;margin-right: 150px; width: 65%;text-align: center">
  92. <el-button size="mini" type="primary" @click="saveWorkPlan()" v-if="currentWeek===weeks">保存工作计划</el-button>
  93. </div>
  94. <!-- 任务详情对话框 -->
  95. <el-dialog title="任务详情" :visible.sync="taskOpen" width="680px" append-to-body
  96. :close-on-click-modal="false">
  97. <task-detail :detail-form="taskForm"></task-detail>
  98. </el-dialog>
  99. </div>
  100. </template>
  101. <script>
  102. import {list} from '@/api/meeting/meeting'
  103. import { deleteWorkPlanById, getMeetingsAndWorkPlansByWeeks, getProjects, saveWorkPlans } from '@/api/meeting/work'
  104. import {getTask} from "@/api/task/task";
  105. import TaskDetail from "../task/components/taskDetail"
  106. export default {
  107. name: 'weekly',
  108. components: {TaskDetail},
  109. data() {
  110. return {
  111. meetingWeek: null,
  112. meetingData: [],
  113. workContents: [],
  114. projects:[],
  115. workPlans: [{
  116. planContent: '请填写工作计划信息',
  117. id: null,
  118. meetingId: null,
  119. completionTimes: null,
  120. completionTime: null,
  121. projectId: null
  122. }],
  123. meetingStatus: null,
  124. weeks: null,
  125. currentWeek: null,
  126. meetingId: null,
  127. taskOpen: false,
  128. taskForm:{},
  129. mergeObj: {}, // 用来记录需要合并行的下标
  130. mergeArr: ['classifyName','projectName','moduleName'], // 表格中的列名
  131. }
  132. },
  133. mounted() {
  134. this.getData()
  135. },
  136. methods: {
  137. stripTags(html) {
  138. return html.replace(/<\/?[^>]+(>|$)/g, '');
  139. },
  140. getData() {
  141. list().then(response => {
  142. this.meetingData = response.data
  143. this.meetingId = this.meetingData.id
  144. //js 获取当前周
  145. const date = new Date();
  146. // 获取当前第几周
  147. let week = this.getYearWeek(date.getFullYear(), Number(date.getMonth()) + 1, date.getDate());
  148. let currentWeek = week ;
  149. this.meetingWeek = currentWeek
  150. this.getMeetingsAndWorkPlansByWeeksData(currentWeek)
  151. })
  152. getProjects().then(res=>{
  153. this.projects=res.data
  154. });
  155. },
  156. getMeetingsAndWorkPlansByWeeksData(currentWeek) {
  157. let weekss = currentWeek
  158. getMeetingsAndWorkPlansByWeeks(currentWeek).then(response => {
  159. this.workContents = response.data.workContent
  160. this.getSpanArr(this.workContents);
  161. if (response.data.workPlan != null && response.data.workPlan.length > 0) {
  162. this.workPlans = response.data.workPlan
  163. }else{
  164. this.workPlans=[{
  165. planContent: '请填写工作计划信息',
  166. id: null,
  167. meetingId: null,
  168. completionTimes: null,
  169. completionTime: null,
  170. projectId: null
  171. }]
  172. }
  173. this.weeks = response.data.weeks
  174. const date = new Date();
  175. // 获取当前第几周
  176. let week = this.getYearWeek(date.getFullYear(), Number(date.getMonth()) + 1, date.getDate());
  177. let currentWeek = week ;
  178. this.currentWeek = currentWeek;
  179. if (weekss !== currentWeek) {
  180. this.workPlans = response.data.workPlan
  181. }
  182. let obj = {};
  183. obj = this.meetingData.find(item => {
  184. return item.weeks === currentWeek;
  185. });
  186. this.meetingId =obj.id
  187. })
  188. },
  189. getYearWeek(a, b, c) {
  190. let date1 = new Date(a, parseInt(b) - 1, c),
  191. date2 = new Date(a, 0, 1),
  192. d = Math.round((date1.valueOf() - date2.valueOf()) / 86400000);
  193. return Math.ceil((d + (date2.getDay() + 1 - 1)) / 7);
  194. },
  195. getWorkData() {
  196. },
  197. generateWeekly() {
  198. if (this.meetingWeek == null || this.meetingWeek == undefined || this.meetingWeek === '') {
  199. this.$message({
  200. message: '请选择会议信息!',
  201. type: 'warning'
  202. });
  203. return
  204. }
  205. this.$PDFSave(this.$refs.exportPdf, "我的工作周报");
  206. },
  207. saveWorkPlan() {
  208. if (this.meetingWeek === null || this.meetingWeek === undefined || this.meetingWeek === '') {
  209. this.$message({
  210. message: '请选择会议信息!',
  211. type: 'warning'
  212. });
  213. return
  214. }
  215. //判断是否存在周会信息,无周会信息,就不保存工作计划
  216. let meetingId=this.meetingId
  217. if(meetingId===undefined || meetingId===null){
  218. this.$message.warning("请选择周会会议,再填写工作计划!")
  219. return
  220. }
  221. let workPlanss = this.workPlans;
  222. for (let i = 0; i < workPlanss.length; i++) {
  223. if(workPlanss[i].planContent==='' || workPlanss[i].completionTimes===''){
  224. this.$message({
  225. message: '请将工作计划填写完整!',
  226. type: 'warning'
  227. });
  228. return
  229. }
  230. workPlanss[i].completionTime = null;
  231. }
  232. let data = {
  233. weeks: this.meetingWeek,
  234. workPlans: workPlanss,
  235. id: this.workPlans.id,
  236. meetingId: this.meetingId
  237. }
  238. saveWorkPlans(data).then(res => {
  239. this.$message({
  240. message: '操作成功',
  241. type: 'success'
  242. });
  243. this.getData()
  244. });
  245. },
  246. addRow() {
  247. let row = {planContent: '', 'op': '', id: null, completionTimes: null}
  248. this.workPlans.push(row)
  249. },
  250. deleteRow(index, row) {
  251. if (index == 0) {
  252. this.$message({
  253. message: '不能删除此条数据',
  254. type: 'warning'
  255. });
  256. return;
  257. }
  258. this.workPlans.splice(index, 1)
  259. let id = row.id;
  260. if (id != null) {
  261. deleteWorkPlanById(id).then(res => {
  262. this.getMeetingsAndWorkPlansByWeeksData(this.meetingWeek)
  263. });
  264. }
  265. },
  266. changeWeekData() {
  267. this.getMeetingsAndWorkPlansByWeeksData(this.meetingWeek)
  268. },
  269. /** 查看任务详情*/
  270. rowClick(row, column, event) {
  271. getTask(row.taskId).then(res => {
  272. this.taskForm = res.data;
  273. this.taskOpen = true;
  274. })
  275. },
  276. objectSpanMethod({row, column, rowIndex, columnIndex}) {
  277. if (this.mergeArr.indexOf(column.property) !== -1) {
  278. // 判断其值是不是为0
  279. if (this.mergeObj[column.property][rowIndex]) {
  280. return [this.mergeObj[column.property][rowIndex], 1]
  281. } else {
  282. // 如果为0则为需要合并的行
  283. return [0, 0];
  284. }
  285. }
  286. },
  287. getSpanArr(data) {
  288. this.mergeArr.forEach((key, index1) => {
  289. let count = 0; // 用来记录需要合并行的起始位置
  290. this.mergeObj[key] = []; // 记录每一列的合并信息
  291. data.forEach((item, index) => {
  292. // index == 0表示数据为第一行,直接 push 一个 1
  293. if (index === 0) {
  294. this.mergeObj[key].push(1);
  295. //item.group=index;
  296. } else {
  297. // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
  298. if (item[key] === data[index - 1][key]) {
  299. this.mergeObj[key][count] += 1;
  300. this.mergeObj[key].push(0);
  301. //item.group = this.tableData[index - 1].group;
  302. } else {
  303. // 如果当前行和上一行其值不相等
  304. count = index; // 记录当前位置
  305. this.mergeObj[key].push(1); // 重新push 一个 1
  306. // item.group = this.tableData[index - 1].group + 1; //如果不一样 将组号设置为上一个数据的组号加1
  307. }
  308. }
  309. })
  310. })
  311. },
  312. }
  313. }
  314. </script>
  315. <style scoped lang="scss">
  316. .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
  317. margin-bottom: 10px;
  318. }
  319. </style>