综合办公系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

chooseMoney.vue 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <template>
  2. <div>
  3. <el-form>
  4. <el-form-item label="项目概况:">
  5. <table border="1">
  6. <tr>
  7. <td style="width: 250px">工作内容</td>
  8. <td style="width:120px;">等级或比例尺</td>
  9. <td style="width:90px;">单位</td>
  10. <td style="width:90px;">工作量</td>
  11. <td style="width: 100px">要求完成时间</td>
  12. <td style="width:90px;">备注</td>
  13. </tr>
  14. <tr v-for="(work, index) in workList" :key="index">
  15. <td>
  16. {{ work.content }}
  17. </td>
  18. <td>
  19. {{ work.scale }}
  20. </td>
  21. <td>
  22. {{ work.unit }}
  23. </td>
  24. <td>
  25. {{ work.workload }}
  26. </td>
  27. <td>
  28. {{ work.deadline }}
  29. </td>
  30. <td>
  31. {{ work.remark }}
  32. </td>
  33. </tr>
  34. </table>
  35. </el-form-item>
  36. <el-form-item label="预结算:">
  37. <table border="1">
  38. <tr>
  39. <td style="width: 100px">工作内容</td>
  40. <td>工作类别</td>
  41. <td>工作项目</td>
  42. <!-- <td>项目细项</td> -->
  43. <td>比例尺</td>
  44. <td>地类类型</td>
  45. <td style="width:90px;">单价</td>
  46. <td style="width:90px;">总工作量</td>
  47. <td style="width:70px;">系数</td>
  48. <td style="min-width:70px;">总额</td>
  49. </tr>
  50. <tr v-for="(work, index) in workList" :key="index">
  51. <td>
  52. {{ work.content }}
  53. </td>
  54. <td>
  55. <el-select v-model="work.workType" :style="{ width: '100%' }" :loading="work.workSelect.workTypeLoading"
  56. @change="getWorkItemList(work, work.workType)">
  57. <el-option v-for="item in work.workSelect.workTypeList" :key="item.value" :label="item.label"
  58. :value="item.value">
  59. </el-option>
  60. </el-select>
  61. </td>
  62. <td>
  63. <el-select v-model="work.workItem" :style="{ width: '100%' }" :remote="true"
  64. @change="getScaleGradeList(work, work.workItem)">
  65. <el-option v-for="item in work.workSelect.workItemList" :key="item.value" :label="item.label"
  66. :value="item.value">
  67. </el-option>
  68. </el-select>
  69. </td>
  70. <td>
  71. <el-select v-model="work.scaleGrade" :style="{ width: '100%' }"
  72. @change="getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType)">
  73. <el-option v-for="item in work.workSelect.scaleGradeList" :key="item.value" :label="item.label"
  74. :value="item.value">
  75. </el-option>
  76. </el-select>
  77. </td>
  78. <td>
  79. <el-select v-model="work.groundType" :style="{ width: '100%' }"
  80. @change="getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType)">
  81. <el-option key="一般地类" label="一般地类" value="0">
  82. </el-option>
  83. <el-option key="复杂地类" label="复杂地类" value="1">
  84. </el-option>
  85. </el-select>
  86. </td>
  87. <td>
  88. {{ work.price }} / {{ work.unit }}
  89. </td>
  90. <td>
  91. {{ work.workload }}
  92. </td>
  93. <td>
  94. <el-input v-model="work.coefficient" placeholder="请输入系数" @blur="getTotal(work)"></el-input>
  95. </td>
  96. <td class="workTotal">
  97. {{ work.settle }}
  98. </td>
  99. </tr>
  100. <tr>
  101. <td colspan="8">合计</td>
  102. <td>{{ Number(settle) - Number(inOutPriceSum) }}</td>
  103. </tr>
  104. </table>
  105. <div style="color:red">tips:预结算表中的系数为:困难系统和调整系数相乘的值(1分制)。例如:困难系数1,调整系数0.8,最终系数为0.8</div>
  106. </el-form-item>
  107. <el-form-item label="进出场费用:">
  108. <el-input v-numeric v-model="inOutPrice" style="width:200px;" @change="getInoutpriceSum">
  109. <template slot="append">人天</template>
  110. </el-input>
  111. ×
  112. <el-input v-numeric v-model="peopleNumber" style="width:200px;" @change="getInoutpriceSum">
  113. <template slot="append">数量</template>
  114. </el-input>
  115. = {{ inOutPriceSum }}
  116. </el-form-item>
  117. <el-form-item label="预结算合计:">
  118. <el-tag type="danger" style="margin-right:20px;font-size:14px;">¥{{ settle }}</el-tag>
  119. </el-form-item>
  120. </el-form>
  121. </div>
  122. </template>
  123. <script>
  124. import { getWorkTypeList, getWorkItemList, getSubItemList, getScaleGradeList, getUnitPrice } from '@/api/oa/price/price'
  125. import { deepClone } from '@/utils'
  126. export default {
  127. props: {
  128. workList: {
  129. type: Array,
  130. require: true
  131. }
  132. },
  133. data() {
  134. return {
  135. // 工作选项
  136. workSelect: {
  137. // 项目列表
  138. projectList: [],
  139. // 工作类别列表
  140. workTypeList: [],
  141. // 工作项目
  142. workItemList: [],
  143. // 项目细项
  144. subItemList: [],
  145. // 比例尺
  146. scaleGradeList: [],
  147. workTypeLoading: true,
  148. workItemLoading: true,
  149. subItemLoading: true,
  150. scaleGradeLoading: true,
  151. },
  152. settle: 0,
  153. inOutPrice:0,
  154. peopleNumber:0,
  155. inOutPriceSum:0
  156. }
  157. },
  158. created() {
  159. for (let work of this.workList) {
  160. this.setValue(work, 'workSelect', deepClone(this.workSelect));
  161. this.getWorkTypeList(work);
  162. }
  163. },
  164. mounted() {
  165. this.getSettleSum();
  166. },
  167. methods: {
  168. /* 获取工作类别 */
  169. getWorkTypeList(work) {
  170. getWorkTypeList().then(res => {
  171. if (res) {
  172. this.setValue(work.workSelect, 'workTypeList', this.setArray(res));
  173. this.setValue(work.workSelect, 'workTypeLoading', false);
  174. }
  175. });
  176. },
  177. /* 获取工作项目 */
  178. getWorkItemList(work, workType) {
  179. getWorkItemList({ workType: workType }).then(res => {
  180. if (res) {
  181. let workItemList = this.setArray(res);
  182. work.workSelect.workItemLoading = false;
  183. work.workSelect.workItemList = workItemList;
  184. work.workItem = workItemList[0].label;
  185. // this.getSubItemList(work, work.workItem);
  186. work.subItem = '';
  187. this.getScaleGradeList(work, work.workItem);
  188. }
  189. })
  190. },
  191. /* 获取项目细项 */
  192. getSubItemList(work, workItem) {
  193. getSubItemList({ workItem }).then(res => {
  194. if (res) {
  195. let subItemList = this.setArray(res);
  196. work.workSelect.subItemLoading = false;
  197. work.workSelect.subItemList = subItemList;
  198. work.subItem = subItemList[0].label;
  199. if (work.scaleGrade == undefined) {
  200. this.setValue(work, 'scaleGrade', '无');
  201. }
  202. if (work.groundType == undefined) {
  203. this.setValue(work, 'groundType', '0');
  204. }
  205. this.getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType);
  206. }
  207. })
  208. },
  209. /* 获取比例尺 */
  210. getScaleGradeList(work, workItem) {
  211. if (work.scale) {
  212. this.setValue(work, 'scaleGrade', work.scale);
  213. if (work.groundType == undefined) {
  214. this.setValue(work, 'groundType', '0');
  215. }
  216. this.getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType);
  217. } else {
  218. getScaleGradeList({ workItem }).then(res => {
  219. if (res) {
  220. let scaleGradeList = this.setArray(res);
  221. work.workSelect.scaleGradeLoading = false;
  222. work.workSelect.scaleGradeList = scaleGradeList;
  223. this.setValue(work, 'scaleGrade', scaleGradeList[0].label)
  224. // work.scaleGrade = scaleGradeList[0].label;
  225. if (work.scaleGrade == undefined) {
  226. this.setValue(work, 'scaleGrade', '无');
  227. }
  228. if (work.groundType == undefined) {
  229. this.setValue(work, 'groundType', '0');
  230. }
  231. this.getUnitPrice(work, work.workItem, work.subItem, work.scaleGrade, work.groundType);
  232. }
  233. })
  234. }
  235. },
  236. /* 获取单价 */
  237. getUnitPrice(work, workItem, subItem, scaleGrade, groundType) {
  238. getUnitPrice({ workItem, subItem, scaleGrade, groundType: groundType }).then(res => {
  239. if (res.length != 0) {
  240. work.priceId = res.data.id;
  241. this.setValue(work, 'price', res.data.price)
  242. this.setValue(work, 'coefficient', 1)
  243. if (work.workload != undefined || work.workload != '') {
  244. this.getTotal(work);
  245. }
  246. }
  247. })
  248. },
  249. /* 获取总额 */
  250. getTotal(work) {
  251. let total = this.calculateTotal(work.price, work.coefficient, work.workload, 1);
  252. this.setValue(work, 'settle', total)
  253. this.getSettleSum();
  254. },
  255. /* 计算总额 */
  256. calculateTotal(price, coefficient, workload, percent) {
  257. return ((parseFloat(price) * parseFloat(coefficient) * parseFloat(workload)) * percent).toFixed(2);
  258. },
  259. getSettleSum() {
  260. let sum = 0;
  261. for (let work of this.workList) {
  262. sum = sum + Number(work.settle)
  263. }
  264. debugger
  265. sum = sum + this.inOutPriceSum;
  266. this.settle = sum.toFixed(2);
  267. let obj = {}
  268. obj.workList = this.workList;
  269. obj.settle = this.settle;
  270. obj.inOutPrice = this.inOutPrice;
  271. obj.peopleNumber = this.peopleNumber;
  272. this.$emit('getSettle', obj);
  273. },
  274. getInoutpriceSum(){
  275. this.inOutPriceSum = Number(this.inOutPrice) * Number(this.peopleNumber);
  276. this.getSettleSum()
  277. },
  278. //数组去重
  279. setArray(arr) {
  280. if (arr != [] && arr != undefined) {
  281. let datalist = [...new Set(arr)];
  282. let list = [];
  283. for (let i of datalist) {
  284. let obj = new Object();
  285. obj.label = i;
  286. obj.value = i;
  287. list.push(obj);
  288. }
  289. return list;
  290. } else {
  291. return [];
  292. }
  293. },
  294. setValue(key, name, val) {
  295. this.$set(key, name, val)
  296. }
  297. }
  298. }
  299. </script>
  300. <style lang="scss" scoped>
  301. table {
  302. /*居中*/
  303. // margin: 0 auto;
  304. /*边框*/
  305. /* border: 1px solid black; */
  306. text-align: center;
  307. border-collapse: collapse;
  308. /*设置背景颜色*/
  309. /* background-color: #bfa; */
  310. td {
  311. padding: 3px;
  312. }
  313. }
  314. </style>