timer.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <template>
  2. <section>
  3. <!--工具条-->
  4. <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
  5. <el-form :inline="true">
  6. <el-form-item label="我的工作计时列表" >
  7. </el-form-item>
  8. <el-form-item style="float:right;">
  9. <el-link type="primary" :underline="false" @click="dialogVisible=true">新增工作计时</el-link>
  10. </el-form-item>
  11. </el-form>
  12. </el-col>
  13. <!--列表-->
  14. <el-table :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
  15. <el-table-column prop="projectName" label="项目" ></el-table-column>
  16. <el-table-column prop="subProjectName" label="子项目" ></el-table-column>
  17. <el-table-column prop="startTime" label="开始时间" >
  18. </el-table-column>
  19. <el-table-column prop="endTime" label="结束时间" >
  20. </el-table-column>
  21. <el-table-column prop="timerShow" label="工作时长" >
  22. </el-table-column>
  23. <el-table-column prop="endTime" label="状态" >
  24. <template slot-scope="scope">
  25. <span style="color:red;" v-if="scope.row.endTime == null">进行中</span>
  26. <span style="color:green;" v-if="scope.row.endTime != null">计时完成</span>
  27. </template>
  28. </el-table-column>
  29. <el-table-column label="操作" width="320">
  30. <template slot-scope="scope">
  31. <el-button type="default" :disabled="scope.row.endTime != null" :loading="logining" size="small" @click="stopTimer(scope.row.id)">停止</el-button>
  32. <el-button type="default" :loading="logining" :disabled="scope.row.endTime == null" size="small" @click="report(scope.row)">{{scope.row.reportId==null?'转日报':'查看日报'}}</el-button>
  33. <el-button type="default" :loading="logining" size="small"
  34. @click="deleteItem(scope.row.id)">删除</el-button>
  35. </template>
  36. </el-table-column>
  37. </el-table>
  38. <!-- 创建自动计时的dialog -->
  39. <el-dialog title="创建自动计时" :visible.sync="dialogVisible" width="550px">
  40. <el-form ref="workForm" :model="workForm" label-width="100px">
  41. <el-form-item label="投入项目" :prop="projectId"
  42. :rules="{ required: true, message: '请选择投入项目', trigger: ['change','blur'] }">
  43. <el-select v-model="workForm.projectId" placeholder="请选择" style="width:200px;"
  44. @change="selectProject()"
  45. >
  46. <el-option v-for="item in projectList"
  47. :key="item.id" :label="item.projectName" :value="item.id"></el-option>
  48. </el-select>
  49. <!--子项目 -->
  50. <el-select v-model="workForm.subProjectId"
  51. placeholder="请选择" style="width:200px;" clearable="true"
  52. >
  53. <el-option v-for="item in subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  54. </el-select>
  55. </el-form-item>
  56. </el-form>
  57. <span slot="footer" class="dialog-footer">
  58. <el-button @click="dialogVisible = false">取消</el-button>
  59. <el-button type="primary" @click="createTimer" >开始计时</el-button>
  60. </span>
  61. </el-dialog>
  62. <!-- 创建日报的dialog -->
  63. <el-dialog title="转日报" :visible.sync="reportDialog" width="550px">
  64. <el-form ref="reportForm" :model="reportForm" label-width="100px">
  65. <el-form-item label="投入项目" >
  66. {{reportForm.projectName}} <span v-if="reportForm.subProjectId != null"> / {{reportForm.subProjectName}} </span>
  67. </el-form-item>
  68. <el-form-item label="开始时间" >
  69. {{reportForm.startTime}}
  70. </el-form-item>
  71. <el-form-item label="结束时间" >
  72. {{reportForm.endTime}}
  73. </el-form-item>
  74. <el-form-item label="时长" >
  75. {{reportForm.timerShow}}
  76. </el-form-item>
  77. <el-form-item label="工作事项" >
  78. <el-input v-model="reportForm.content" type="textarea" :rows="4" placeholder="请填写工作事项" clearable
  79. ></el-input>
  80. </el-form-item>
  81. </el-form>
  82. <span slot="footer" class="dialog-footer">
  83. <el-button @click="reportDialog = false">取消</el-button>
  84. <el-button type="primary" @click="submitReport" >提交日报</el-button>
  85. </span>
  86. </el-dialog>
  87. </section>
  88. </template>
  89. <script>
  90. import util from "../../common/js/util";
  91. export default {
  92. data() {
  93. return {
  94. firstLoadTime:null,
  95. projectList: [], //项目列表
  96. subProjectList:[],
  97. user: JSON.parse(sessionStorage.getItem("user")),
  98. dialogVisible: false,
  99. search: {
  100. value: 0,
  101. date: util.formatDate.format(new Date(new Date()), "yyyy-MM-dd"),
  102. },
  103. workForm:{},
  104. users: [],
  105. tableHeight: 0,
  106. listLoading: false,
  107. total: 0,
  108. page: 1,
  109. size: 20,
  110. list: [],
  111. logining: false,
  112. timer:null,
  113. reportForm:{},
  114. reportDialog: false
  115. };
  116. },
  117. methods: {
  118. submitReport() {
  119. this.http.post('/project-timer/tranferToReport',this.reportForm,
  120. res => {
  121. if (res.code == "ok") {
  122. this.reportDialog = false;
  123. this.getList();
  124. this.$message({
  125. message: '日报已提交,等待项目经理审核',
  126. type: "success"
  127. });
  128. }
  129. },
  130. error => {
  131. this.listLoading = false;
  132. this.$message({
  133. message: error,
  134. type: "error"
  135. });
  136. }
  137. );
  138. },
  139. report(row) {
  140. if (row.reportId == null) {
  141. this.reportForm = row;
  142. this.reportDialog = true;
  143. } else {
  144. this.$router.push('/daily');
  145. }
  146. },
  147. stopTimer(id) {
  148. this.$confirm("确定要停止计时吗?","提示", {
  149. confirmButtonText: "确定",
  150. cancelButtonText: "取消",
  151. type: "warning"
  152. })
  153. .then(() => {
  154. this.listLoading = true;
  155. this.http.post('/project-timer/endTimer',{id: id},
  156. res => {
  157. this.listLoading = false;
  158. if (res.code == "ok") {
  159. this.getList();
  160. } else {
  161. this.$message({
  162. message: res.msg,
  163. type: "error"
  164. });
  165. }
  166. },
  167. error => {
  168. this.$message({
  169. message: error,
  170. type: "error"
  171. });
  172. }
  173. );
  174. })
  175. .catch(() => {});
  176. },
  177. deleteItem(id) {
  178. this.$confirm("确定要删除该记录吗?","提示", {
  179. confirmButtonText: "确定",
  180. cancelButtonText: "取消",
  181. type: "warning"
  182. })
  183. .then(() => {
  184. this.listLoading = true;
  185. this.http.post('/project-timer/deleteTimer',{id: id},
  186. res => {
  187. this.listLoading = false;
  188. if (res.code == "ok") {
  189. this.getList();
  190. } else {
  191. this.$message({
  192. message: res.msg,
  193. type: "error"
  194. });
  195. }
  196. },
  197. error => {
  198. this.listLoading = false;
  199. this.$message({
  200. message: error,
  201. type: "error"
  202. });
  203. }
  204. );
  205. })
  206. .catch(() => {});
  207. },
  208. //创建计时器
  209. createTimer() {
  210. this.$refs.workForm.validate(valid => {
  211. if (valid) {
  212. if (this.workForm.projectId == null) {
  213. this.$message({
  214. message: '请选择投入项目',
  215. type: "error"
  216. });
  217. return;
  218. }
  219. this.workForm.projectName = this.projectList.filter(p=>p.id == this.workForm.projectId)[0].projectName;
  220. if (this.workForm.subProjectId != null) {
  221. this.workForm.subProjectName = this.subProjectList.filter(s=>s.id == this.workForm.subProjectId)[0].name;
  222. }
  223. this.http.post('/project-timer/addTimer',this.workForm,
  224. res => {
  225. if (res.code == "ok") {
  226. this.dialogVisible = false;
  227. this.getList();
  228. }
  229. },
  230. error => {
  231. this.listLoading = false;
  232. this.$message({
  233. message: error,
  234. type: "error"
  235. });
  236. }
  237. );
  238. }
  239. });
  240. },
  241. //项目选中了, 加载子项目
  242. selectProject() {
  243. this.workForm.subProjectId = null;
  244. this.subProjectList = [];
  245. this.http.post('/sub-project/list',{
  246. projectId: this.workForm.projectId
  247. },
  248. res => {
  249. if (res.code == "ok") {
  250. this.subProjectList = res.data;
  251. }
  252. },
  253. error => {
  254. this.listLoading = false;
  255. this.$message({
  256. message: error,
  257. type: "error"
  258. });
  259. }
  260. );
  261. },
  262. //获取项目列表
  263. getProjectList() {
  264. this.listLoading = true;
  265. this.http.post( this.port.project.list, {},
  266. res => {
  267. this.listLoading = false;
  268. if (res.code == "ok") {
  269. this.projectList = res.data;
  270. } else {
  271. this.$message({
  272. message: res.msg,
  273. type: "error"
  274. });
  275. }
  276. },
  277. error => {
  278. this.listLoading = false;
  279. this.$message({
  280. message: error,
  281. type: "error"
  282. });
  283. });
  284. },
  285. //获取定时任务列表
  286. getList() {
  287. this.listLoading = true;
  288. this.http.post('/project-timer/getMyTimer', {},
  289. res => {
  290. this.listLoading = false;
  291. if (res.code == "ok") {
  292. this.list = res.data;
  293. } else {
  294. this.$message({
  295. message: res.msg,
  296. type: "error"
  297. });
  298. }
  299. },
  300. error => {
  301. this.listLoading = false;
  302. this.$message({
  303. message: error,
  304. type: "error"
  305. });
  306. });
  307. },
  308. calculateTimer() {
  309. if (this.list != null) {
  310. var now = new Date();
  311. var myList = JSON.parse(JSON.stringify(this.list));
  312. console.log(myList);
  313. for (var i=0;i<myList.length; i++) {
  314. if (myList[i].endTime == null) {
  315. if (myList[i].timerShow == null) {
  316. myList[i].timerShow = this.formatTimer(myList[i].timer);
  317. this.firstLoadTime = now;
  318. } else {
  319. myList[i].timerShow = this.formatTimer(myList[i].timer + ((now.getTime() - this.firstLoadTime.getTime())/1000));
  320. }
  321. } else {
  322. myList[i].timerShow = this.formatTimer(myList[i].timer);
  323. }
  324. }
  325. this.list = myList;
  326. // this.$forceUpdate();
  327. }
  328. },
  329. formatTimer(t) {
  330. var hours = parseInt(t/3600);
  331. var minutes = parseInt(t%3600/60);
  332. var seconds = parseInt(t%60);
  333. var show = '';
  334. console.log('hours=='+hours);
  335. show += hours<10?('0'+hours):hours;
  336. show += ':';
  337. show += minutes<10?('0'+minutes):minutes;
  338. show += ':';
  339. show += seconds<10?('0'+seconds):seconds;
  340. return show;
  341. }
  342. },
  343. created() {
  344. let height = window.innerHeight;
  345. this.tableHeight = height - 125;
  346. const that = this;
  347. window.onresize = function temp() {
  348. that.tableHeight = window.innerHeight - 125;
  349. };
  350. },
  351. mounted() {
  352. this.getList();
  353. this.getProjectList();
  354. this.timer = setInterval(() => {
  355. this.calculateTimer();
  356. }, 1000);
  357. },
  358. beforeDestroy() {
  359. clearInterval(this.timer);
  360. }
  361. };
  362. </script>
  363. <style lang="scss" scoped>
  364. </style>