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.

398 lines
12 KiB

4 years ago
  1. <template>
  2. <div class="enterprise">
  3. <div class="sys_type">
  4. <div class="sys_desc">
  5. <h2>选择产品</h2>
  6. <div class="selectItem">
  7. <div class="item" :class="{active: active == 'xmgl' }" @click="active = 'xmgl'">
  8. <span>项目管理系统</span>
  9. </div>
  10. <div class="item" :class="{active: active == 'oa' }" @click="active = 'oa'">
  11. <span>智慧协同办公系统</span>
  12. </div>
  13. <div class="item" :class="{active: active == 'mall' }" @click="active = 'mall'">
  14. <span>电商定制系统</span>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="sys_modules">
  19. <div class="module" v-for="(item, index) in menus[active]" :key="index" >
  20. <div class="head" :class="{active: item.isChecked == true}" @click="selectItem(item, index)">
  21. <div class="module_top">
  22. <img :src="item.logoUrl" alt="">
  23. <span>{{item.name}}</span>
  24. </div>
  25. <div v-if="item.isChecked == true" :class="{module_bottom_active: item.isChecked == true}" class="module_bottom">
  26. <i class="selected el-icon-check"></i>
  27. </div>
  28. </div>
  29. <div class="footer" v-if="item.isChecked == true">
  30. <el-input-number style="width: 180px;" @change="numChange(item)" v-model="item.num" :min="10" :max="99999" ></el-input-number>
  31. </div>
  32. </div>
  33. </div>
  34. </div>
  35. <div class="buy_count">
  36. <h2>
  37. 购买数量
  38. <span>(购买账号不能少于10人)</span>
  39. </h2>
  40. <div class="buy_count_items">
  41. <div class="oItem" v-for="(item, index) in totalList" :key="index">
  42. <div class="item_header">
  43. <p>{{item.name}}</p>
  44. </div>
  45. <div class="item_bottom">
  46. <span>{{item.val}}</span>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. <div class="buy_date">
  52. <h2>期限选择</h2>
  53. <div class="buy_date_items">
  54. <div class="oItem" @click="selectBuyDate(item)" v-for="(item, index) in useTimeOptions" :key="index">
  55. <div class="header">
  56. {{item.label}}
  57. <i v-if="item.isChecked" class="select el-icon-success"></i>
  58. </div>
  59. <div class="bottom">
  60. <img v-if="item.isHot" src="@/assets/image/module/hot.png" alt="">
  61. <p>{{item.price}}/人月</p>
  62. </div>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="pay_way">
  67. <h2>支付方式</h2>
  68. <div class="pay_way_items">
  69. <div class="oItem" @click="selectPayWay(item)" v-for="(item, index) in payWayOptions" :key="index">
  70. <img :src="item.icon">
  71. <span>{{item.label}}</span>
  72. <i v-if="item.isChecked" class="select el-icon-success"></i>
  73. </div>
  74. </div>
  75. <el-input size="larget" v-model="form.phone" class="phone" placeholder="输入手机号"></el-input>
  76. </div>
  77. <div class="pay_allAmount">
  78. <h2>订单总额</h2>
  79. <p class="allAmount"><b>{{allAmount}}</b>/</p>
  80. <el-checkbox v-model="form.checked">同意</el-checkbox> <a style="font-size: 14px;color: #409EFF">服务协议</a>
  81. </div>
  82. </div>
  83. </template>
  84. <script>
  85. import { mapGetters } from 'vuex';
  86. import {getAllMenuModule, getBuyMenuModule} from '@/api/mdp/sys/modules'
  87. import aliPay from '@/assets/image/module/alipay.png';
  88. import weixinPay from '@/assets/image/module/weixin.png'
  89. import Decimal from "decimal.js" // 具体文件中引入
  90. import { months } from 'moment';
  91. export default {
  92. props: ['menus'],
  93. data() {
  94. return {
  95. menuLoading: false,
  96. active: "xmgl",
  97. payWayOptions: [
  98. {
  99. label: '支付宝',
  100. val: 'aliPay',
  101. icon: aliPay,
  102. isChecked: true
  103. },
  104. {
  105. label: '微信',
  106. val: 'weixinPay',
  107. icon: weixinPay,
  108. isChecked: false
  109. }
  110. ],
  111. useTimeOptions: [
  112. {
  113. label: '1年',
  114. val: '12',
  115. isHot: true,
  116. isChecked: true,
  117. price: '200.00'
  118. },
  119. {
  120. label: '6个月',
  121. val: '6',
  122. isHot: false,
  123. isChecked: false,
  124. price: '200.00'
  125. },
  126. {
  127. label: '3个月',
  128. val: '3',
  129. isHot: false,
  130. isChecked: false,
  131. price: '200.00'
  132. },
  133. ],
  134. form: {
  135. payway: 'aliPay',
  136. usetime: '12',
  137. phone: '',
  138. checked: false,
  139. amount: 0
  140. }
  141. }
  142. },
  143. computed: {
  144. totalList() {
  145. if(this.menus == null) return;
  146. let obj = [{key: 'xmgl',name: '项目管理', val : 0},{key: 'oa',name: '智慧协同办公系统',val : 0},{key: 'mall',name: '商城',val : 0}]
  147. let xmCount = 0;
  148. let oaConut = 0;
  149. let mallCount = 0;
  150. this.menus.xmgl.forEach(m => {
  151. if(m.isChecked) {
  152. xmCount += m.num;
  153. }
  154. });
  155. this.menus.oa.forEach(m => {
  156. if(m.isChecked) {
  157. oaConut += m.num;
  158. }
  159. });
  160. this.menus.mall.forEach(m => {
  161. if(m.isChecked) {
  162. mallCount += m.num;
  163. }
  164. });
  165. obj[0].val = xmCount;
  166. obj[1].val = oaConut;
  167. obj[2].val = mallCount;
  168. return obj
  169. },
  170. allAmount() {
  171. if(this.menus == null) return;
  172. //计费规则
  173. let tempData = [];
  174. let xm = this.menus.xmgl.filter(res => {return res.isChecked == true;})
  175. let oa = this.menus.oa.filter(res => {return res.isChecked == true;})
  176. let mall = this.menus.mall.filter(res => {return res.isChecked == true;})
  177. tempData = Array.concat(xm).concat(oa).concat(mall);
  178. //计算价格,每个单独计算
  179. let amount = new Decimal(0);
  180. let allNum = 0;
  181. //人均费用 * 数量 * 数量折扣优惠 * 月份折扣优惠
  182. tempData.forEach(t => {
  183. let numDiscount = 1;
  184. let monthDiscount = 1;
  185. allNum += t.num;
  186. //免费
  187. if(t.billMode == 0) {
  188. amount = amount.add(0);
  189. }
  190. if(t.billMode == 1) {
  191. if(t.discount != null && t.discount != "" && t.discount != undefined) {
  192. let discount = JSON.parse(t.discount);
  193. //用户数量折扣
  194. numDiscount = this.getNumDiscount(discount.userNum, t.num);
  195. //用户月份折扣
  196. monthDiscount = this.getMonthDiscount(discount.months, this.form.usetime);
  197. }
  198. amount = amount.add(new Decimal(t.uniFee).mul(new Decimal(t.num)).mul(numDiscount).mul(monthDiscount));
  199. }
  200. //总包模式
  201. if(t.billMode == 2) {
  202. amount = amount.add(new Decimal(t.fee));
  203. }
  204. })
  205. this.form.amount = amount;
  206. return amount;
  207. }
  208. },
  209. watch: {
  210. allAmount: {
  211. handler(val, oval) {
  212. let tempData = [];
  213. let xm = this.menus.xmgl.filter(res => {return res.isChecked == true;})
  214. let oa = this.menus.oa.filter(res => {return res.isChecked == true;})
  215. let mall = this.menus.mall.filter(res => {return res.isChecked == true;})
  216. tempData = Array.concat(xm).concat(oa).concat(mall);
  217. let yearAmount = new Decimal(0);
  218. let halfYearAmount = new Decimal(0);
  219. let quarter = new Decimal(0);
  220. let allNum = 0;
  221. tempData.forEach(t => {
  222. let numDiscount = 1;
  223. let monthDiscount = 1;
  224. allNum += t.num;
  225. if(t.discount != null && t.discount != "" && t.discount != undefined) {
  226. let discount = JSON.parse(t.discount);
  227. //用户数量折扣
  228. numDiscount = this.getNumDiscount(discount.userNum, t.num);
  229. this.useTimeOptions.forEach(element => {
  230. //用户月份折扣
  231. monthDiscount = this.getMonthDiscount(discount.months, element.val);
  232. if(element.val == "12") {
  233. yearAmount = yearAmount.add(new Decimal(t.uniFee).mul(new Decimal(t.num)).mul(numDiscount).mul(monthDiscount));
  234. }
  235. if(element.val == "6") {
  236. halfYearAmount = halfYearAmount.add(new Decimal(t.uniFee).mul(new Decimal(t.num)).mul(numDiscount).mul(monthDiscount));
  237. }
  238. if(element.val == "3") {
  239. quarter = quarter.add(new Decimal(t.uniFee).mul(new Decimal(t.num)).mul(numDiscount).mul(monthDiscount));
  240. }
  241. });
  242. }else {
  243. yearAmount = yearAmount.add(new Decimal(t.uniFee).mul(new Decimal(t.num)));
  244. halfYearAmount = halfYearAmount.add(new Decimal(t.uniFee).mul(new Decimal(t.num)));
  245. quarter = quarter.add(new Decimal(t.uniFee).mul(new Decimal(t.num)));
  246. }
  247. })
  248. this.useTimeOptions.forEach(element => {
  249. if(element.val == "12" && yearAmount != 0) {
  250. element.price = yearAmount.div(allNum).toFixed(2, Decimal.ROUND_HALF_UP);
  251. }
  252. if(element.val == "6" && halfYearAmount != 0) {
  253. element.price = halfYearAmount.div(allNum).toFixed(2, Decimal.ROUND_HALF_UP);
  254. }
  255. if(element.val == "3" && quarter != 0) {
  256. element.price = quarter.div(allNum).toFixed(2, Decimal.ROUND_HALF_UP);
  257. }
  258. })
  259. },
  260. immediate: true
  261. }
  262. },
  263. methods: {
  264. getNumDiscount(discount, num) {
  265. let sale = new Decimal(1);
  266. let nums = discount.split("\n");
  267. var map = new Map();
  268. nums.forEach(element => {
  269. let t = element.split(":");
  270. map.set(t[0], t[1]);
  271. });
  272. map.forEach(function(value,key){
  273. let t = key.split("-");
  274. if(num >= t[0] && num <= t[1]) {
  275. sale = new Decimal(value).div(new Decimal(100))
  276. }
  277. });
  278. return sale;
  279. },
  280. getMonthDiscount(discount, month) {
  281. let sale = new Decimal(1);
  282. let condition = discount.split("\n");
  283. var map = new Map();
  284. condition.forEach(element => {
  285. let t = element.split(":");
  286. map.set(t[0], t[1]);
  287. });
  288. map.forEach(function(value, key){
  289. if(new Decimal(month).comparedTo(key) == 0) {
  290. sale = new Decimal(value).div(new Decimal(100))
  291. }
  292. });
  293. return sale;
  294. },
  295. numChange(item) {
  296. item.isChecked = true;
  297. },
  298. selectItem(item) {
  299. if(this.active == 'xmgl') {
  300. this.menus.xmgl.forEach(element => {
  301. if(element.id == item.id) {
  302. element.isChecked ? element.isChecked = !element.isChecked : element.isChecked = true;
  303. }
  304. });
  305. }
  306. if(this.active == 'mall') {
  307. this.menus.mall.forEach(element => {
  308. if(element.id == item.id) {
  309. element.isChecked ? element.isChecked = !element.isChecked : element.isChecked = true;
  310. }
  311. });
  312. }
  313. if(this.active == 'oa') {
  314. this.menus.oa.forEach(element => {
  315. if(element.id == item.id) {
  316. element.isChecked ? element.isChecked = !element.isChecked : element.isChecked = true;
  317. }
  318. });
  319. }
  320. },
  321. selectPayWay(item) {
  322. this.form.payway = item.val;
  323. this.payWayOptions.forEach(element => {
  324. element.isChecked = false;
  325. if(item.val == element.val) {
  326. element.isChecked = true;
  327. }
  328. });
  329. },
  330. selectBuyDate(item) {
  331. this.form.usetime = item.val;
  332. this.useTimeOptions.forEach(element => {
  333. element.isChecked = false;
  334. if(item.val == element.val) {
  335. element.isChecked = true;
  336. }
  337. });
  338. },
  339. getForm() {
  340. let tempData = [];
  341. let xm = this.menus.xmgl.filter(res => {return res.isChecked == true;})
  342. let oa = this.menus.oa.filter(res => {return res.isChecked == true;})
  343. let mall = this.menus.mall.filter(res => {return res.isChecked == true;})
  344. tempData = Array.concat(xm).concat(oa).concat(mall);
  345. let obj = {
  346. data: tempData,
  347. ...this.form
  348. }
  349. return obj;
  350. },
  351. },
  352. created() {
  353. }
  354. }
  355. </script>
  356. <style lang="scss">
  357. @import './index.scss';
  358. </style>