chooseOption1.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  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. console.log(data);
  92. this.productName = data.productName;
  93. this.productId = data.params.productId;
  94. this.logo = data.logo;
  95. this.planDataExpansion.id = data.params.companyId;
  96. this.planDataExpansion.nameSimple = data.nameSimple;
  97. this.planDataExpansion.cnName = data.cnName;
  98. this.quotableCompanyList = data.quotableCompanyList;
  99. this.vehicleAndVesselTaxVo.identifyNumber = data.identifyNumber;
  100. this.vehicleAndVesselTaxVo.taxpayerName = data.taxpayerName;
  101. this.queryPlan(data.params); //方案查询
  102. })
  103. await this.getDicType("car_tax_code"); //车船税类型
  104. await this.getDicType("car_tax_reason_code"); //减免税原因代码
  105. await this.getDicType("ya_damage_verification"); //车损验车事项
  106. },
  107. methods: {
  108. confirmPlan(name) {
  109. let pages = getCurrentPages(); //获取所有页面栈实例列表
  110. let nowPage = pages[pages.length - 1]; //当前页页面实例
  111. let prevPage = pages[pages.length - 2]; //上一页页面实例
  112. let prevPage1 = pages[pages.length - 3]; //上一页页面实例
  113. this.quotableCompanyList.map(val => {
  114. if (val.id == this.planDataExpansion.id) {
  115. val.insurancePlanInfo = this.planDataExpansion.genericPlanInfo;
  116. // 重选标记:已有报价结果说明是“重选”方案(区别于首次选择方案),
  117. // 供计算保费页区分重选前/重选后——重选后保留旧价格并显示“重新报价”按钮
  118. if (val.result) {
  119. val.isReSelect = true;
  120. }
  121. if (val.insurancePlanInfo.kinds.length > 0) {
  122. let objkindList = [];
  123. val.insurancePlanInfo.kinds.map((ele, index) => {
  124. if (ele.amount != "0" && ["A", "SY_WBDWGZ"].includes(ele.kindCode)) {
  125. objkindList.push({
  126. amount: val.insurancePlanInfo.kinds[index]
  127. .amount,
  128. kindCode: val.insurancePlanInfo.kinds[
  129. index].kindCode,
  130. kindName: val.insurancePlanInfo.kinds[
  131. index].kindName
  132. });
  133. } else if (ele.amount != "0" && ["SY_FJ_YBW2", "D4"]
  134. .includes(ele
  135. .kindCode)) {
  136. objkindList.push({
  137. unitAmount: val.insurancePlanInfo.kinds[
  138. index].amount,
  139. kindCode: val.insurancePlanInfo.kinds[
  140. index].kindCode,
  141. kindName: val.insurancePlanInfo.kinds[
  142. index].kindName
  143. });
  144. } else if (ele.amount != "0" && ["MJ1", "MJ2", "MJ3",
  145. "MJ4"
  146. ].includes(ele
  147. .kindCode)) {
  148. objkindList.push({
  149. deductibleRate: val.insurancePlanInfo
  150. .kinds[index].amount,
  151. kindCode: val.insurancePlanInfo.kinds[
  152. index].kindCode,
  153. kindName: val.insurancePlanInfo.kinds[
  154. index].kindName
  155. });
  156. } else if (ele.amount != "0" && ["TY1", "TY2", "TY3",
  157. "TY4"
  158. ].includes(ele
  159. .kindCode)) {
  160. objkindList.push({
  161. serviceTimes: String(val.insurancePlanInfo
  162. .kinds[index]
  163. .amount),
  164. kindCode: val.insurancePlanInfo.kinds[
  165. index].kindCode,
  166. kindName: val.insurancePlanInfo.kinds[
  167. index].kindName
  168. });
  169. } else if (ele.amount != "0") {
  170. objkindList.push({
  171. amount: val.insurancePlanInfo.kinds[index]
  172. .amount,
  173. kindCode: val.insurancePlanInfo.kinds[
  174. index].kindCode,
  175. kindName: val.insurancePlanInfo.kinds[
  176. index].kindName
  177. });
  178. }
  179. return ele;
  180. })
  181. val.insurancePlanInfo.kinds = objkindList;
  182. }
  183. if (this.planDataExpansion.genericPlanInfo.schemeType == '2') {
  184. val.insurancePlanInfo.drivings = this.accidentalDrivingVo;
  185. }
  186. if (!val.insurancePlanInfo.schemeName) {
  187. return uni.showToast({
  188. icon: "none",
  189. title: '未选中方案',
  190. })
  191. }
  192. }
  193. return val;
  194. })
  195. if (prevPage.route == 'pages/quote/premiumCalc1') {
  196. prevPage.$vm.quotableCompanyList = [...this.quotableCompanyList];
  197. prevPage.$vm.vehicleAndVesselTaxVo = {
  198. ...this.vehicleAndVesselTaxVo
  199. };
  200. prevPage.$vm.vehicleAndVesselTaxModel = {
  201. ...this.vehicleAndVesselTaxModel
  202. };
  203. uni.navigateBack({
  204. delta: 1
  205. });
  206. }
  207. },
  208. //获取方案
  209. async queryPlan(params) {
  210. let res = await this.$http.get('/scheme/getSchemeResult', params);
  211. if (res.code == '200') {
  212. if (res.data.schemes) {
  213. this.planDataExpansion.genericPlanList = [...res.data.schemes];
  214. }
  215. if (res.data.optionalScheme) {
  216. this.planDataExpansion.genericPlanList = [...res.data.schemes, res.data.optionalScheme];
  217. }
  218. this.planDataExpansion.genericPlanInfo = res.data.schemes[0];
  219. this.SelectedPlanId = res.data.schemes[0].id;
  220. } else {
  221. this.planDataExpansion.genericPlanList = [];
  222. this.planDataExpansion.genericPlanInfo = {};
  223. this.SelectedPlanId = "";
  224. }
  225. },
  226. //数据字典
  227. async getDicType(type) {
  228. let res = await this.$http.get('/dict/get?dictCode=' + type);
  229. this[type + "options"] = res.data;
  230. },
  231. // 选择方案
  232. selectedPlan(index) {
  233. console.log(index);
  234. console.log(this.planDataExpansion.genericPlanList);
  235. this.SelectedPlanId = index;
  236. let planObj = this.planDataExpansion.genericPlanList.find(item => item.id == index);
  237. if (planObj.schemeType == '2') {
  238. if (planObj.kinds && planObj.kinds.length > 0) {
  239. planObj.kinds.map(item => {
  240. const itemamtList = item.options.map(val => {
  241. return val.label
  242. })
  243. if (!itemamtList.includes('不投保')) {
  244. item.amount = item.options[0].value;
  245. item.amountDesc = item.options[0].label;
  246. }
  247. return item;
  248. })
  249. }
  250. this.drivingInsuranceData = planObj.drivings; //保险公司驾意险列表
  251. planObj.drivings.map(val => val.quantity = Number(val.quantity))
  252. const list = planObj.drivings.filter(val => val.selectedStatus != '3')
  253. this.accidentalDrivingVo = list;
  254. }
  255. this.planDataExpansion.genericPlanInfo = planObj;
  256. },
  257. // 永安车损验车事项回调
  258. carCheckerUpdate(index) {
  259. this.carChecker = index;
  260. },
  261. }
  262. }
  263. </script>
  264. <style lang="scss" scoped>
  265. page {
  266. background-color: #f8f8f8;
  267. }
  268. .page {
  269. background-color: #f8f8f8;
  270. height: 100%;
  271. }
  272. .planListView {
  273. border-top: 1rpx solid #eee;
  274. padding: 30rpx;
  275. box-sizing: border-box;
  276. background: #fff;
  277. background-image: url('../../static/image/car-insure/planback.png');
  278. background-size: 100% 100%;
  279. .companyLogo {
  280. width: 40rpx;
  281. height: 40rpx;
  282. }
  283. .companyName {
  284. font-size: 36rpx;
  285. color: #333;
  286. font-weight: bold;
  287. }
  288. .status-tag {
  289. width: 80rpx;
  290. height: 40rpx;
  291. background: #FFEAEE;
  292. border-radius: 20rpx 20rpx 20rpx 0rpx;
  293. font-size: 24rpx;
  294. color: #FF5174;
  295. font-weight: bold;
  296. }
  297. .content-body {
  298. gap: 20rpx;
  299. .selectItem {
  300. padding: 9rpx 24rpx;
  301. border-radius: 4rpx 4rpx 4rpx 4rpx;
  302. border: 1rpx solid #eee;
  303. font-size: 30rpx;
  304. color: #333;
  305. }
  306. .itemactive {
  307. position: relative;
  308. border: 1px solid #FDE935;
  309. border-radius: 4rpx 4rpx 4rpx 4rpx;
  310. background-color: rgba(253, 233, 53, 0.15);
  311. &::after {
  312. content: '';
  313. position: absolute;
  314. right: 0;
  315. bottom: 0;
  316. width: 0;
  317. height: 0;
  318. border-style: solid;
  319. border-width: 0 0 24rpx 24rpx;
  320. /* 调整三角形大小 */
  321. border-color: transparent transparent #FDE935 transparent;
  322. /* 黄色三角形 */
  323. }
  324. &::before {
  325. content: '✓';
  326. position: absolute;
  327. right: 3rpx;
  328. /* 微调位置 */
  329. bottom: 0;
  330. font-size: 14rpx;
  331. /* 调整对勾大小 */
  332. color: #333;
  333. /* 对勾颜色 */
  334. z-index: 1;
  335. /* 确保对勾在三角形上方 */
  336. }
  337. }
  338. }
  339. }
  340. .footer {
  341. position: fixed;
  342. bottom: 0;
  343. left: 0;
  344. right: 0;
  345. padding: 25rpx 30rpx 55rpx;
  346. box-sizing: border-box;
  347. background: linear-gradient(0deg, #FFFFFF 0%, rgba(255, 254, 245, 0.7) 100%);
  348. border-radius: 0rpx 0rpx 0rpx 0rpx;
  349. backdrop-filter: blur(12rpx);
  350. .btn {
  351. min-width: 0;
  352. flex: auto;
  353. background: #FDE935;
  354. border: 1rpx solid #FDE935;
  355. padding: 18rpx 0;
  356. box-sizing: border-box;
  357. border-radius: 58rpx 58rpx 58rpx 58rpx;
  358. font-size: 36rpx;
  359. color: #1F1F1F;
  360. }
  361. //操作按钮特殊样式
  362. .btns {
  363. background: rgba(253, 233, 53, 0.2);
  364. border: 1rpx solid #FDE935;
  365. padding: 18rpx 0;
  366. box-sizing: border-box;
  367. }
  368. }
  369. </style>