chooseOption.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <template>
  2. <view class="page">
  3. <!-- 头部吸顶区域 -->
  4. <u-sticky zIndex="999" customNavHeight="0">
  5. <uni-NavBar headerTitle="报价方案" background="#fff" :isSlot="false" :rightIcon="false">
  6. </uni-NavBar>
  7. <!-- 方案视图 -->
  8. <view class="planListView">
  9. <!-- 头部保险公司信息 -->
  10. <view class="header dis a-c ">
  11. <image :src="logo" class="companyLogo" mode=""></image>
  12. <text class="companyName ml-1 mr-2">{{planDataExpansion.nameSimple}}</text>
  13. <view class="status-tag dis a-c j-c">
  14. {{productName}}
  15. </view>
  16. </view>
  17. <!-- 方案列表 -->
  18. <view class="content-body dis a-c f-wrap mt-3">
  19. <view class="selectItem" @click="selectedPlan(item.id)"
  20. :class="item.id==SelectedPlanId?'itemactive':''"
  21. v-for="item in planDataExpansion.genericPlanList" :key="item.id">
  22. {{item.schemeName}}
  23. </view>
  24. </view>
  25. </view>
  26. </u-sticky>
  27. <!-- 自选方案内容 -->
  28. <customPlan v-if="planDataExpansion.genericPlanInfo.schemeType=='2'" :productName="productName"
  29. :vehicleAndVesselTaxVo="vehicleAndVesselTaxVo" :vehicleAndVesselTaxModel="vehicleAndVesselTaxModel"
  30. :car_tax_codeoptions="car_tax_codeoptions" :car_tax_reason_codeoptions="car_tax_reason_codeoptions"
  31. :ya_damage_verificationoptions="ya_damage_verificationoptions" @carCheckerUpdate="carCheckerUpdate"
  32. :planDataExpansion="planDataExpansion" :drivingInsuranceData="drivingInsuranceData"
  33. :accidentalDrivingVo="accidentalDrivingVo">
  34. </customPlan>
  35. <!-- 普通方案内容 -->
  36. <standardPlan v-if="planDataExpansion.genericPlanInfo.schemeType=='1'" :productName="productName"
  37. :vehicleAndVesselTaxVo="vehicleAndVesselTaxVo" :vehicleAndVesselTaxModel="vehicleAndVesselTaxModel"
  38. :car_tax_codeoptions="car_tax_codeoptions" :car_tax_reason_codeoptions="car_tax_reason_codeoptions"
  39. :planDataExpansion="planDataExpansion">
  40. </standardPlan>
  41. <view class="footer dis a-c j-s">
  42. <view class="btn btns dis a-c j-c mr-3" @click="back">
  43. 取消
  44. </view>
  45. <!-- <view class="btn dis a-c j-c mr-3" @click="save">
  46. 保存
  47. </view> -->
  48. <view class="btn dis a-c j-c " @click="confirmPlan">
  49. 使用该方案报价
  50. </view>
  51. </view>
  52. </view>
  53. </template>
  54. <script>
  55. import Mixin from './Mixin.js';
  56. import customPlan from './modules/customPlan.vue'; //自选方案
  57. import standardPlan from './modules/standardPlan.vue'; //普通方案
  58. export default {
  59. mixins: [Mixin], // 注入 Mixin
  60. components: {
  61. customPlan,
  62. standardPlan,
  63. },
  64. data() {
  65. return {
  66. logo: "", //保险公司logo
  67. productName: "", //险种名称
  68. productId: "", //险种code
  69. SelectedPlanId: "", //已选方案id
  70. planDataExpansion: { //方案综合数据
  71. id: "",
  72. nameSimple: "",
  73. cnName: "",
  74. genericPlanList: [], //方案通用列表
  75. genericPlanInfo: {}, //方案展示信息
  76. },
  77. car_tax_codeoptions: [], //车船税类型
  78. car_tax_reason_codeoptions: [], //减免税原因
  79. ya_damage_verificationoptions: [], //车损验车事项
  80. carChecker: "",
  81. drivingInsuranceData: [], //保险公司驾意险列表
  82. accidentalDrivingVo: [], //选中驾意险列表
  83. }
  84. },
  85. onShow() {
  86. },
  87. async onLoad() {
  88. const eventChannel = this.getOpenerEventChannel()
  89. // 监听acceptData事件,获取上一页面通过eventChannel传送到当前页面的数据
  90. await eventChannel.on('acceptData', (data) => {
  91. this.productName = data.productName;
  92. this.productId = data.params.productId;
  93. this.logo = data.logo;
  94. this.planDataExpansion.id = data.params.companyId;
  95. this.planDataExpansion.nameSimple = data.nameSimple;
  96. this.planDataExpansion.cnName = data.cnName;
  97. this.quotableCompanyList = data.quotableCompanyList;
  98. this.vehicleAndVesselTaxVo.identifyNumber = data.identifyNumber;
  99. this.vehicleAndVesselTaxVo.taxpayerName = data.taxpayerName;
  100. this.queryPlan(data.params); //方案查询
  101. })
  102. await this.getDicType("car_tax_code"); //车船税类型
  103. await this.getDicType("car_tax_reason_code"); //减免税原因代码
  104. await this.getDicType("ya_damage_verification"); //车损验车事项
  105. },
  106. methods: {
  107. confirmPlan(name) {
  108. let pages = getCurrentPages(); //获取所有页面栈实例列表
  109. let nowPage = pages[pages.length - 1]; //当前页页面实例
  110. let prevPage = pages[pages.length - 2]; //上一页页面实例
  111. let prevPage1 = pages[pages.length - 3]; //上一页页面实例
  112. this.quotableCompanyList.map(val => {
  113. if (val.id == this.planDataExpansion.id) {
  114. val.insurancePlanInfo = this.planDataExpansion.genericPlanInfo;
  115. // 重选标记:已有报价结果说明是“重选”方案(区别于首次选择方案),
  116. // 供计算保费页区分重选前/重选后——重选后保留旧价格并显示“重新报价”按钮
  117. if (val.result) {
  118. val.isReSelect = true;
  119. }
  120. if (val.insurancePlanInfo.kinds.length > 0) {
  121. let objkindList = [];
  122. val.insurancePlanInfo.kinds.map((ele, index) => {
  123. if (ele.amount != "0" && ["A", "SY_WBDWGZ"].includes(ele.kindCode)) {
  124. objkindList.push({
  125. amount: val.insurancePlanInfo.kinds[index]
  126. .amount,
  127. kindCode: val.insurancePlanInfo.kinds[
  128. index].kindCode,
  129. kindName: val.insurancePlanInfo.kinds[
  130. index].kindName
  131. });
  132. } else if (ele.amount != "0" && ["SY_FJ_YBW2", "D4"]
  133. .includes(ele
  134. .kindCode)) {
  135. objkindList.push({
  136. amount: val.insurancePlanInfo.kinds[
  137. index].amount,
  138. kindCode: val.insurancePlanInfo.kinds[
  139. index].kindCode,
  140. kindName: val.insurancePlanInfo.kinds[
  141. index].kindName
  142. });
  143. } else if (ele.amount != "0" && ["MJ1", "MJ2", "MJ3",
  144. "MJ4"
  145. ].includes(ele
  146. .kindCode)) {
  147. objkindList.push({
  148. deductibleRate: val.insurancePlanInfo
  149. .kinds[index].amount,
  150. kindCode: val.insurancePlanInfo.kinds[
  151. index].kindCode,
  152. kindName: val.insurancePlanInfo.kinds[
  153. index].kindName
  154. });
  155. } else if (ele.amount != "0" && ["TY1", "TY2", "TY3",
  156. "TY4"
  157. ].includes(ele
  158. .kindCode)) {
  159. objkindList.push({
  160. serviceTimes: String(val.insurancePlanInfo
  161. .kinds[index]
  162. .amount),
  163. kindCode: val.insurancePlanInfo.kinds[
  164. index].kindCode,
  165. kindName: val.insurancePlanInfo.kinds[
  166. index].kindName
  167. });
  168. } else if (ele.amount != "0") {
  169. objkindList.push({
  170. amount: val.insurancePlanInfo.kinds[index]
  171. .amount,
  172. kindCode: val.insurancePlanInfo.kinds[
  173. index].kindCode,
  174. kindName: val.insurancePlanInfo.kinds[
  175. index].kindName
  176. });
  177. }
  178. return ele;
  179. })
  180. val.insurancePlanInfo.kinds = objkindList;
  181. }
  182. if (this.planDataExpansion.genericPlanInfo.schemeType == '2') {
  183. val.insurancePlanInfo.drivings = this.accidentalDrivingVo;
  184. }
  185. if (!val.insurancePlanInfo.schemeName) {
  186. return uni.showToast({
  187. icon: "none",
  188. title: '未选中方案',
  189. })
  190. }
  191. }
  192. return val;
  193. })
  194. if (prevPage.route == 'pages/quote/premiumCalc') {
  195. prevPage.$vm.quotableCompanyList = [...this.quotableCompanyList];
  196. prevPage.$vm.vehicleAndVesselTaxVo = {
  197. ...this.vehicleAndVesselTaxVo
  198. };
  199. prevPage.$vm.vehicleAndVesselTaxModel = {
  200. ...this.vehicleAndVesselTaxModel
  201. };
  202. uni.navigateBack({
  203. delta: 1
  204. });
  205. }
  206. },
  207. //获取方案
  208. async queryPlan(params) {
  209. let res = await this.$http.post('/scheme/getSchemeResult', params);
  210. if (res.code == '200') {
  211. if (res.data.schemes) {
  212. this.planDataExpansion.genericPlanList = [...res.data.schemes];
  213. }
  214. if (res.data.optionalScheme) {
  215. this.planDataExpansion.genericPlanList = [...res.data.schemes, res.data.optionalScheme];
  216. }
  217. this.planDataExpansion.genericPlanInfo = res.data.schemes[0];
  218. this.SelectedPlanId = res.data.schemes[0].id;
  219. } else {
  220. this.planDataExpansion.genericPlanList = [];
  221. this.planDataExpansion.genericPlanInfo = {};
  222. this.SelectedPlanId = "";
  223. }
  224. },
  225. //数据字典
  226. async getDicType(type) {
  227. let res = await this.$http.get('/dict/get?dictCode=' + type);
  228. this[type + "options"] = res.data;
  229. },
  230. // 选择方案
  231. selectedPlan(index) {
  232. this.SelectedPlanId = index;
  233. let planObj = this.planDataExpansion.genericPlanList.find(item => item.id == index);
  234. if (planObj.schemeType == '2') {
  235. if (planObj.kinds && planObj.kinds.length > 0) {
  236. planObj.kinds.map(item => {
  237. const itemamtList = item.options.map(val => {
  238. return val.label
  239. })
  240. if (!itemamtList.includes('不投保')) {
  241. item.amount = item.options[0].value;
  242. item.amountDesc = item.options[0].label;
  243. }
  244. return item;
  245. })
  246. }
  247. this.drivingInsuranceData = planObj.drivings; //保险公司驾意险列表
  248. planObj.drivings.map(val => val.quantity = Number(val.quantity))
  249. const list = planObj.drivings.filter(val => val.selectedStatus != '3')
  250. this.accidentalDrivingVo = list;
  251. }
  252. this.planDataExpansion.genericPlanInfo = planObj;
  253. },
  254. // 永安车损验车事项回调
  255. carCheckerUpdate(index) {
  256. this.carChecker = index;
  257. },
  258. }
  259. }
  260. </script>
  261. <style lang="scss" scoped>
  262. page {
  263. background-color: #f8f8f8;
  264. }
  265. .page {
  266. background-color: #f8f8f8;
  267. height: 100%;
  268. }
  269. .planListView {
  270. border-top: 1rpx solid #eee;
  271. padding: 30rpx;
  272. box-sizing: border-box;
  273. background: #fff;
  274. background-image: url('../../static/image/car-insure/planback.png');
  275. background-size: 100% 100%;
  276. .companyLogo {
  277. width: 40rpx;
  278. height: 40rpx;
  279. }
  280. .companyName {
  281. font-size: 36rpx;
  282. color: #333;
  283. font-weight: bold;
  284. }
  285. .status-tag {
  286. width: 80rpx;
  287. height: 40rpx;
  288. background: #FFEAEE;
  289. border-radius: 20rpx 20rpx 20rpx 0rpx;
  290. font-size: 24rpx;
  291. color: #FF5174;
  292. font-weight: bold;
  293. }
  294. .content-body {
  295. gap: 20rpx;
  296. .selectItem {
  297. padding: 9rpx 24rpx;
  298. border-radius: 4rpx 4rpx 4rpx 4rpx;
  299. border: 1rpx solid #eee;
  300. font-size: 30rpx;
  301. color: #333;
  302. }
  303. .itemactive {
  304. position: relative;
  305. border: 1px solid #FDE935;
  306. border-radius: 4rpx 4rpx 4rpx 4rpx;
  307. background-color: rgba(253, 233, 53, 0.15);
  308. &::after {
  309. content: '';
  310. position: absolute;
  311. right: 0;
  312. bottom: 0;
  313. width: 0;
  314. height: 0;
  315. border-style: solid;
  316. border-width: 0 0 24rpx 24rpx;
  317. /* 调整三角形大小 */
  318. border-color: transparent transparent #FDE935 transparent;
  319. /* 黄色三角形 */
  320. }
  321. &::before {
  322. content: '✓';
  323. position: absolute;
  324. right: 3rpx;
  325. /* 微调位置 */
  326. bottom: 0;
  327. font-size: 14rpx;
  328. /* 调整对勾大小 */
  329. color: #333;
  330. /* 对勾颜色 */
  331. z-index: 1;
  332. /* 确保对勾在三角形上方 */
  333. }
  334. }
  335. }
  336. }
  337. .footer {
  338. position: fixed;
  339. bottom: 0;
  340. left: 0;
  341. right: 0;
  342. padding: 25rpx 30rpx 55rpx;
  343. box-sizing: border-box;
  344. background: linear-gradient(0deg, #FFFFFF 0%, rgba(255, 254, 245, 0.7) 100%);
  345. border-radius: 0rpx 0rpx 0rpx 0rpx;
  346. backdrop-filter: blur(12rpx);
  347. .btn {
  348. min-width: 0;
  349. flex: auto;
  350. background: #FDE935;
  351. border: 1rpx solid #FDE935;
  352. padding: 18rpx 0;
  353. box-sizing: border-box;
  354. border-radius: 58rpx 58rpx 58rpx 58rpx;
  355. font-size: 36rpx;
  356. color: #1F1F1F;
  357. }
  358. //操作按钮特殊样式
  359. .btns {
  360. background: rgba(253, 233, 53, 0.2);
  361. border: 1rpx solid #FDE935;
  362. padding: 18rpx 0;
  363. box-sizing: border-box;
  364. }
  365. }
  366. </style>