TraceTimeLine.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <!--
  2. 作者:yangzhijie1488@163.com
  3. 时间:2017-12-12
  4. 描述:追踪单时间节点
  5. -->
  6. <template>
  7. <div>
  8. <div>
  9. <div class="page-header">
  10. <h4>时间节点({{ number }}/{{ count }})({{ trace.projectTaskName }})</h4>
  11. </div>
  12. </div>
  13. <div
  14. v-if="timeLines != undefined && timeLines[0].id != undefined"
  15. class="panel panel-default"
  16. >
  17. <div class="panel-body">
  18. <div
  19. v-for="item in timeLines"
  20. :key="item.id"
  21. class="after-selection--columns"
  22. style="margin-top: 5px; cursor: pointer"
  23. >
  24. <span>
  25. <Checkbox
  26. :id="'trace-finish-' + item.id"
  27. v-model="item.finished"
  28. class-name="terms"
  29. class="trace-checkbox"
  30. @input="openCloseTraceTimeLine(item)"
  31. />
  32. </span>
  33. <span class="big-icon trace-summary" @click="editTraceTimeLine(item)">
  34. {{ item.content == undefined ? "请填写" : item.content }}
  35. </span>
  36. <span class="trace-summary" @click="editTraceTimeLine(item)">
  37. <span
  38. class="label"
  39. :class="{
  40. 'label-danger': item.overdue == true,
  41. 'label-primary': item.overdue != true,
  42. }"
  43. >
  44. {{ item.userName == undefined ? "" : item.userName }}
  45. &nbsp;
  46. {{ formatDate(item.endDate) }}
  47. </span>
  48. </span>
  49. </div>
  50. </div>
  51. </div>
  52. <button
  53. v-if="trace.finished != true"
  54. type="button"
  55. style="width: 100%"
  56. class="btn btn-default"
  57. aria-label="Left Align"
  58. @click="createTraceTimeLine"
  59. >
  60. <span class="glyphicon glyphicon-plus" aria-hidden="true" />添加时间节点
  61. </button>
  62. <Loading ref="loading" />
  63. </div>
  64. </template>
  65. <script>
  66. var Uuid = require('pc-component-v3').Uuid;
  67. var Common = require('../common/Common.js');
  68. import TraceCommon from './TraceCommon.js';
  69. var Loading = require('pc-component-v3').Loading;
  70. import MyProgress from '../widget/MyProgress.vue';
  71. var Checkbox = require('pc-component-v3').Checkbox;
  72. export default {
  73. components: {
  74. MyProgress,
  75. Checkbox,
  76. Loading,
  77. },
  78. // props: ['traceId', 'trace'],
  79. props: {
  80. traceId: {
  81. type: String,
  82. default: null,
  83. },
  84. trace: {
  85. type: String,
  86. default: null,
  87. },
  88. },
  89. data: function () {
  90. return {
  91. uuid: Uuid.createUUID(),
  92. timeLines: [
  93. {
  94. id: undefined,
  95. traceId: undefined,
  96. userId: undefined,
  97. userName: undefined,
  98. content: undefined,
  99. endDate: undefined,
  100. },
  101. ],
  102. count: 0,
  103. number: 0,
  104. progress: 0,
  105. timeLine: {
  106. traceId: undefined,
  107. userId: undefined,
  108. userName: undefined,
  109. content: undefined,
  110. endDate: undefined,
  111. },
  112. formatDate: TraceCommon.formatDate,
  113. };
  114. },
  115. watch: {
  116. traceId: function (curVal, oldVal) {
  117. if (curVal != undefined) {
  118. this.refresh();
  119. }
  120. },
  121. },
  122. mounted: function () {
  123. if (this.traceId != undefined) {
  124. this.refresh();
  125. this.timeLine.traceId = this.traceId;
  126. }
  127. },
  128. methods: {
  129. /**
  130. * 根据追踪单Id查询追踪时间节点数据
  131. * @author GuoZhiBo 20171201
  132. */
  133. getTimeLine: function () {
  134. var _self = this;
  135. $.ajax({
  136. url: Common.getApiURL('TraceTimeLineResource/listByTraceId'),
  137. type: 'get',
  138. dataType: 'json',
  139. async: false,
  140. data: {
  141. traceId: _self.traceId,
  142. },
  143. beforeSend: function (request) {
  144. Common.addTokenToRequest(request);
  145. },
  146. success: function (data) {
  147. _self.timeLines = data;
  148. _self.addEmtpyTraceTimeLine();
  149. },
  150. error: function (XMLHttpRequest, textStatus, errorThrown) {
  151. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  152. },
  153. });
  154. },
  155. /**
  156. * 根据追踪单ID查询时间节点总数量
  157. * @author GuoZhiBo 20171201
  158. */
  159. getTimeLineCount: function () {
  160. var _self = this;
  161. $.ajax({
  162. url: Common.getApiURL('TraceTimeLineResource/queryTraceTimeLineCount'),
  163. type: 'get',
  164. dataType: 'json',
  165. async: false,
  166. data: {
  167. traceId: _self.traceId,
  168. },
  169. beforeSend: function (request) {
  170. Common.addTokenToRequest(request);
  171. },
  172. success: function (data) {
  173. _self.count = data;
  174. _self.progresss();
  175. },
  176. error: function (XMLHttpRequest, textStatus, errorThrown) {
  177. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  178. },
  179. });
  180. },
  181. /**
  182. * 根据追踪单Id查询时间节点的完成数量
  183. * @author GuoZhiBo 20171201
  184. */
  185. getTimeLineNumber: function () {
  186. var _self = this;
  187. $.ajax({
  188. url: Common.getApiURL('TraceTimeLineResource/queryTraceTimeLineNumber'),
  189. type: 'get',
  190. dataType: 'json',
  191. async: false,
  192. data: {
  193. traceId: _self.traceId,
  194. },
  195. beforeSend: function (request) {
  196. Common.addTokenToRequest(request);
  197. },
  198. success: function (data) {
  199. _self.number = data;
  200. _self.progresss();
  201. },
  202. error: function (XMLHttpRequest, textStatus, errorThrown) {
  203. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  204. },
  205. });
  206. },
  207. /**
  208. * 计算progress
  209. * @author GuoZhiBo 20171201
  210. */
  211. progresss: function () {
  212. var _self = this;
  213. if (_self.number == 0 || _self.count == 0) {
  214. _self.progress = 0;
  215. } else {
  216. _self.progress = (_self.number / _self.count).toFixed(2) * 100;
  217. }
  218. },
  219. /**
  220. * 添加空的时间节点
  221. */
  222. addEmtpyTraceTimeLine: function () {
  223. var _self = this;
  224. if (_self.timeLines == undefined) {
  225. _self.timeLines = [];
  226. }
  227. for (var i = _self.timeLines.length; i < 1; i++) {
  228. var emtpyTraceTimeLine = {
  229. id: undefined,
  230. traceId: _self.traceId,
  231. userId: undefined,
  232. userName: undefined,
  233. content: undefined,
  234. endDate: undefined,
  235. };
  236. _self.timeLines.push(emtpyTraceTimeLine);
  237. }
  238. },
  239. /**
  240. * 编辑时间节点
  241. * @param {Object} traceTimeLine
  242. */
  243. editTraceTimeLine: function (traceTimeLine) {
  244. var _self = this;
  245. this.$router.push({
  246. path: '/trace/traceTimeLineEdit/' + traceTimeLine.id,
  247. query: {
  248. projectId: _self.trace.projectId,
  249. },
  250. });
  251. },
  252. /**
  253. * 创建时间节点
  254. */
  255. createTraceTimeLine: function () {
  256. var _self = this;
  257. this.$router.push({
  258. path: '/trace/traceTimeLineCreate/' + this.trace.id,
  259. query: {
  260. projectId: _self.trace.projectId,
  261. },
  262. });
  263. },
  264. /**
  265. * 打开或关闭时间节点
  266. * @param {Object} traceTimeLine
  267. */
  268. openCloseTraceTimeLine: function (traceTimeLine) {
  269. var _self = this;
  270. if (_self.trace.finished != true) {
  271. _self.$refs.loading.show();
  272. $.ajax({
  273. url: Common.getApiURL(
  274. 'TraceTimeLineResource/updateTraceTimeLineFinished',
  275. ),
  276. type: 'post',
  277. contentType: 'application/json',
  278. data: JSON.stringify(traceTimeLine),
  279. beforeSend: function (request) {
  280. Common.addTokenToRequest(request);
  281. },
  282. success: function (data) {
  283. _self.$refs.loading.hide();
  284. _self.refresh();
  285. _self.$emit('refreshTraceLog');
  286. },
  287. error: function (XMLHttpRequest, textStatus, errorThrown) {
  288. _self.$refs.loading.hide();
  289. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  290. },
  291. });
  292. } else {
  293. Notify.error('提示', '已完成的订单不能修改!');
  294. }
  295. },
  296. /**
  297. * 刷新界面
  298. */
  299. refresh: function () {
  300. this.getTimeLine();
  301. this.getTimeLineCount();
  302. this.getTimeLineNumber();
  303. },
  304. },
  305. };
  306. </script>
  307. <style scoped>
  308. .mui-checkbox-self {
  309. left: 0px !important;
  310. top: 0px !important;
  311. }
  312. .font-color {
  313. color: red;
  314. }
  315. .big-icon {
  316. font-size: large;
  317. }
  318. .trace-summary {
  319. font-size: large;
  320. margin-left: 5px;
  321. margin-right: 5px;
  322. }
  323. .trace-checkbox {
  324. display: inline;
  325. font-size: large;
  326. }
  327. </style>