收银台

This commit is contained in:
Vinjor 2024-09-27 10:05:48 +08:00
parent 21195ccf2a
commit 21e34c8ebe
3 changed files with 192 additions and 70 deletions

View File

@ -68,6 +68,8 @@ public class PayCenterServiceImpl implements PayCenterService {
**/
@Override
public Object getActivity(Map<String, String> map) {
//实际会收钱的支付方式
List<String> canUsePayWays = Arrays.asList("ALIPAY","WECHAT","UNIONPAY","CASH");
/*1.先把所有用到的值取出来 */
//当前时间从点击结算的这一刻算
Date nowDate = new Date();
@ -103,6 +105,10 @@ public class PayCenterServiceImpl implements PayCenterService {
String payWay = map.get("payWay");
/*2.查询所有可参加的营销活动 */
List<ActivityVO> actList = new ArrayList<>();
if(!canUsePayWays.contains(payWay)){
//所选支付方式不符合活动参与条件
return actList;
}
try {
//2.1 查可参加的分时优惠和限时特价
actList.addAll(this.getFenshiAndTejiaAct(nowDate,userId,gradeId,storeId,labelIdList,oilAmount,oilLiter,oilId,oilPrice,payWay));
@ -351,6 +357,8 @@ public class PayCenterServiceImpl implements PayCenterService {
**/
@Override
public Object getCoupon(Map<String, String> map){
//实际会收钱的支付方式
List<String> canUsePayWays = Arrays.asList("ALIPAY","WECHAT","UNIONPAY","CASH");
/*1.先把所有用到的值取出来 */
//当前时间从点击结算的这一刻算
Date nowDate = new Date();
@ -364,6 +372,12 @@ public class PayCenterServiceImpl implements PayCenterService {
Double oilAmount = Double.valueOf(map.getOrDefault("oilAmount","0"));
//油升数
Double oilLiter = Double.valueOf(map.getOrDefault("oilLiter","0"));
//支付方式
String payWay = map.get("payWay");
if("after_pay".equals(payWay)){
//挂账不可以用优惠券
return new ArrayList<>();
}
//选择的商品
List<GoodsVO> goodsList = new ArrayList<>();
String goodsStr = map.getOrDefault("goods","");
@ -401,6 +415,10 @@ public class PayCenterServiceImpl implements PayCenterService {
List<CouponVO> rtnList = new ArrayList<>();
if(!filteredList.isEmpty()){
for(CardCouponVO rule:filteredList){
if("0".equals(rule.getUseWithOther()) && !canUsePayWays.contains(payWay)){
//不可以与其他优惠同时用且支付方式不是 实际付钱的跳过
break;
}
CouponVO couponVO = new CouponVO();
couponVO.setId(rule.getDataId());
couponVO.setCouponId(rule.getId());

View File

@ -164,11 +164,11 @@ public class CheckUtil {
nowWeek =7;
}
if(timeSlotList.contains(nowWeek)){
//周几是符合的返回不可用
return false;
}else{
//周几是不符合的进而判断时间是否符合
//周几是符合的再判断时间是否符合
return checkDayTimeReverse(nowDate,startTime,endTime);
}else{
//周几是不符合的直接可用
return true;
}
}else{
//活动设置的适用时间类型是每月
@ -337,23 +337,37 @@ public class CheckUtil {
* @return java.lang.Boolean
**/
public Boolean checkGoodsCoupon(CardCouponVO couponVO, List<GoodsVO> goodsList){
if("5".equals(couponVO.getType()) || goodsList.isEmpty()){
if("5".equals(couponVO.getType())){
//单品立减券
if(StringUtils.isNotEmpty(couponVO.getProductIds())){
//限制使用的商品id
List<String> ruleGoodsList = Arrays.asList(couponVO.getProductIds().split(StrUtil.COMMA));
//过滤出符合条件的本订单的商品
List<GoodsVO> filteredList = goodsList.stream().filter(goods->ruleGoodsList.contains(goods.getId())).collect(Collectors.toList());
//计算符合条件的商品订单总金额
double orderAmount =0.0;
if(!filteredList.isEmpty()){
orderAmount = filteredList.stream().mapToDouble(GoodsVO::getAmount).sum();
}
return orderAmount>=couponVO.getReachAmount();
}else{
//未设置可用商品不符合
if(goodsList.isEmpty()){
//没商品不可用
return false;
}
//符合条件的商品
List<GoodsVO> filteredList;
if("1".equals(couponVO.getProductLimit())){
//不限制使用商品
filteredList = goodsList;
}else if("2".equals(couponVO.getProductLimit())){
//自定义商品
if(StringUtils.isNotEmpty(couponVO.getProductIds())) {
List<String> ruleGoodsList = Arrays.asList(couponVO.getProductIds().split(StrUtil.COMMA));
//过滤出符合条件的本订单的商品
filteredList = goodsList.stream().filter(goods -> ruleGoodsList.contains(goods.getId())).collect(Collectors.toList());
}else{
//未设置可用商品不符合
return false;
}
}else{
//超出预设值范围不可用
return false;
}
//计算符合条件的商品订单总金额
double orderAmount =0.0;
if(!filteredList.isEmpty()){
orderAmount = filteredList.stream().mapToDouble(GoodsVO::getAmount).sum();
}
return orderAmount>=couponVO.getReachAmount();
}else{
//其他券或者本订单未选择商品不需要判断商品
return true;
@ -589,8 +603,6 @@ public class CheckUtil {
Double disAmount = 0.0;
DecimalFormat df = new DecimalFormat("#.00");
try {
//1 按加油金额否则 按加油升数
Double thisValue = "1".equals(coupon.getUseType())?oilAmount:oilLiter;
if("1".equals(coupon.getType())){
//代金券-直接拿优惠金额
disAmount = coupon.getReduceAmount();
@ -605,9 +617,12 @@ public class CheckUtil {
}else if("4".equals(coupon.getType())){
//油品立减券每满多少升减多少钱
//计算能除尽多少次就减多少次
int thisInt = (int) (thisValue / coupon.getLjOilNum());
int thisInt = (int) (oilLiter / coupon.getLjOilNum());
//计算优惠金额
disAmount = thisInt * coupon.getLjOilAmount();
}else if("5".equals(coupon.getType())){
//单品立减券,直接拿优惠金额
disAmount = coupon.getReduceAmount();
}
}catch (Exception e){
log.error("优惠券优惠金额计算失败:"+e.getMessage(),e);
@ -710,7 +725,7 @@ public class CheckUtil {
* @return boolean
**/
private static boolean checkDayTimeReverse(Date nowDate,String dayStartTime,String dayEndTime){
String dayStr = DateUtil.date(nowDate).toString();
String dayStr = DateUtil.formatDate(nowDate);
//时间范围区间
Date startTime = DateUtil.parse(dayStr+" "+(StringUtils.isNotEmpty(dayStartTime)?(dayStartTime+":00"):"00:00:00"));
Date endTime = DateUtil.parse(dayStr+" "+(StringUtils.isNotEmpty(dayEndTime)?(dayEndTime+":59"):"23:59:59"));

View File

@ -64,13 +64,13 @@
<div class="d-top">
<div class="d-b">
<el-checkbox v-model="checkAll">活动优惠 <i class="el-icon-arrow-down"></i></el-checkbox>
<el-checkbox v-model="showAct">活动优惠 <i class="el-icon-arrow-down"></i></el-checkbox>
<div class="or_num"></div>
</div>
<!-- 下拉列表插入-->
<div v-if="checkAll == true">
<div v-if="showAct == true">
<div v-if="activityList.length>0">
<el-radio-group style="width: 100%" v-model="chooseAct">
<el-radio-group style="width: 100%" v-model="chooseActId" @change="handleChangeAct">
<div class="x-d-b" v-for="(item,index) in activityList">
<el-radio :label="item.id">{{null==item.ruleName?item.actName:item.ruleName}}<div class="or_num">-{{item.disAmount}}</div></el-radio>
</div>
@ -82,15 +82,15 @@
</div>
<div class="d-b">
<el-checkbox v-model="checkAll">优惠券 <i class="el-icon-arrow-down"></i></el-checkbox>
<el-checkbox v-model="showCoupon">优惠券 <i class="el-icon-arrow-down"></i></el-checkbox>
<div class="or_num"></div>
</div>
<!-- 下拉列表插入-->
<div v-if="checkAll == true">
<div v-if="showCoupon == true">
<div v-if="couponList.length>0">
<el-radio-group style="width: 100%" v-model="chooseAct">
<div class="x-d-b" v-for="(item,index) in activityList">
<el-radio :label="item.id">{{null==item.ruleName?item.actName:item.ruleName}}<div class="or_num">-{{item.disAmount}}</div></el-radio>
<el-radio-group style="width: 100%" v-model="chooseCouponId" @change="handleChangeCoupon">
<div class="x-d-b" v-for="(item,index) in couponList">
<el-radio :label="item.id">{{item.name}}<div class="or_num">-{{item.disAmount}}</div></el-radio>
</div>
</el-radio-group>
</div>
@ -100,20 +100,20 @@
</div>
</div>
<div class="three-top">
<div class="addbor">
<div class="">扫码支付</div>
<div class="or_num">0.00</div>
</div>
<div class="addbor">
<div class="">找零</div>
<div class="or_num">0.00</div>
</div>
<div class="addbor">
<div class="">加油员</div>
<div class="or_num">0.00</div>
</div>
</div>
<!-- <div class="three-top">-->
<!-- <div class="addbor">-->
<!-- <div class="">扫码支付</div>-->
<!-- <div class="or_num">0.00</div>-->
<!-- </div>-->
<!-- <div class="addbor">-->
<!-- <div class="">找零</div>-->
<!-- <div class="or_num">0.00</div>-->
<!-- </div>-->
<!-- <div class="addbor">-->
<!-- <div class="">加油员</div>-->
<!-- <div class="or_num">0.00</div>-->
<!-- </div>-->
<!-- </div>-->
<div class="er-box"></div>
<div class="wrap-box">
<div class="f-box" v-for="(item,index) in payList" :class="{'f-acvite' : item.dictValue == payWay }"
@ -126,8 +126,8 @@
<div class="box-bottom">
<div>
<div class="price_">0.00</div>
<div class="price_prefer">优惠合计:0.00</div>
<div class="price_">{{realAmount}}</div>
<div class="price_prefer">优惠合计:{{disTotal}}</div>
</div>
<div class="anniu">立即结算</div>
</div>
@ -545,15 +545,23 @@ export default {
//
couponList:[],
// actId_ruleId
chooseAct:"",
//
chooseCoupon:"",
chooseActId:"",
//id
chooseCouponId:"",
//
chooseAct:{},
//
chooseCoupon:{},
//--
payWay: "ALIPAY",
//
orderAmount:0.0,
orderAmount:0.00,
//
oilLiter:0,
oilLiter:0.00,
//
realAmount:0.00,
//
disTotal:0.00,
openConfirm:false,
//
isPay:false,
@ -580,16 +588,10 @@ export default {
state: '',
//
pendingOrdersList: [],
timeout: null,
boxShow: true,
boxShow1: true,
boxShow2: true,
checkList: [],
checkAll: true,
checkAll1: false,
checkAll2: false,
checkAll3: false,
isIndeterminate: true,
//
showAct: true,
//
showCoupon: true,
freeTicket:false,
freeIndex:0,
freeTicketList:[
@ -658,17 +660,45 @@ export default {
flag:1,
jishuqi:0,
continuePolling: true, //
}
},
watch: {
//
chooseActId: {
handler(newVal) {
console.log("选择的活动发生变化", newVal);
//
this.getDisTotal()
},
deep: true,
immediate: true,
},
//
chooseCouponId: {
handler(newVal) {
console.log("选择的优惠券发生变化", newVal);
//
this.getDisTotal()
},
deep: true,
immediate: true,
},
//
orderAmount: {
handler(newVal) {
console.log("订单总金额发生变化", newVal);
//
this.getActivity()
//
this.getCoupon()
//
this.realAmount = (this.orderAmount - this.disTotal).toFixed(2)
},
deep: true,
immediate: true,
},
//
disTotal:{
handler(newVal) {
console.log("优惠总金额发生变化", newVal);
//
this.realAmount = (this.orderAmount - this.disTotal).toFixed(2)
},
deep: true,
immediate: true,
@ -685,6 +715,10 @@ export default {
this.orderAmount = this.getGoodsNum
}
this.refuelingAmount = false
//
this.getActivity()
//
this.getCoupon()
}
},
//
@ -696,6 +730,8 @@ export default {
}else {
this.orderAmount = newVal
}
//
this.getCoupon()
}
},
components: {
@ -745,6 +781,48 @@ export default {
},
methods: {
/**
* 获取优惠总金额
* */
getDisTotal(){
this.disTotal = 0.00
if(""!=this.chooseCouponId){
this.disTotal += this.chooseCoupon.disAmount
}
if(""!=this.chooseActId){
this.disTotal += this.chooseAct.disAmount
}
this.disTotal = (this.disTotal).toFixed(2)
},
/**
* 监听活动选择切换
* */
handleChangeAct(value){
this.chooseAct = this.activityList.filter(item=>item.id === value)[0]
if(""!=this.chooseCouponId){
//
if("0"==this.chooseCoupon.useWithOther){
//
this.chooseCouponId = ""
this.chooseCoupon = {}
}
}
this.getDisTotal()
console.log("选中的活动",this.chooseAct)
},
/**
* 监听优惠券选择切换
* */
handleChangeCoupon(value){
this.chooseCoupon = this.couponList.filter(item=>item.id === value)[0]
if("0"==this.chooseCoupon.useWithOther){
//
this.chooseAct = {}
this.chooseActId = ""
}
this.getDisTotal()
console.log("选中的优惠券",this.chooseCoupon)
},
async collection1() {
let actualPayment = 0
let makeChange = 0
@ -981,6 +1059,7 @@ export default {
* @date 2024年9月19日
*/
getActivity(){
this.chooseActId=''
//
if(this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId") && this.chooseVipUser.hasOwnProperty("id")){
//
@ -1009,11 +1088,13 @@ export default {
* @date 2024年9月19日
*/
getCoupon(){
this.chooseCouponId=''
//
if(this.chooseVipUser.hasOwnProperty("id") && (this.goodsList.length>0 || (this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId")))){
//
let dataObj = {
userId: this.chooseVipUser.id
userId: this.chooseVipUser.id,
payWay: this.payWay
}
if(this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId")){
//
@ -1057,12 +1138,17 @@ export default {
restVipUser(){
this.userInfo = false
this.chooseVipUser = {}
this.getActivity()
this.getCoupon()
},
chooseUser(data){
if (data){
//
this.userInfo = true
this.chooseVipUser = data
//
this.getActivity()
this.getCoupon()
console.log(this.chooseVipUser,598)
}
@ -1293,6 +1379,9 @@ export default {
*/
setindex(value) {
this.payWay = value
//
this.getActivity()
this.getCoupon()
},
setRefuelingAmount(item) {
this.refuelingAmount = true
@ -1557,18 +1646,18 @@ input {
}
.x-d-b {
width: 90%;
width: 95%;
display: flex;
align-items: center;
justify-content: space-between;
margin: 15px 0px;
margin-left: 10%;
margin-left: 4%;
}
.d-top {
width: 100%;
box-sizing: border-box;
padding: 0px 40px;
padding: 0 40px 20px 40px;
font-size: 16px;
color: #555555;
border-bottom: #f6f8f9 4px solid;