生产计划自动化-功能优化 5.16

master
zhc077 2 years ago
parent c62e4e7c16
commit 558ecd11e9
  1. 22
      ant-design-vue-jeecg/src/views/message/ZySpeechMessageList.vue
  2. 71
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/demo/zyorders/service/impl/ZyOrdersServiceImpl.java
  3. 2
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/productplan/controller/ZyProductPlanController.java
  4. 22
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/productplan/service/impl/IZyProductPlanAutoServiceImpl.java
  5. 4
      jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/workorder/service/impl/WorkOrderServiceImpl.java

@ -84,6 +84,9 @@
class="j-table-force-nowrap" class="j-table-force-nowrap"
@change="handleTableChange"> @change="handleTableChange">
<span slot="action" slot-scope="text, record"> <span slot="action" slot-scope="text, record">
<a v-if="record.status ==1" @click="reSetStatus(record.id,'0')">重置
<a-divider type="vertical"/>
</a>
<a @click="MySpeak(record)">播放</a> <a @click="MySpeak(record)">播放</a>
<a-divider type="vertical"/> <a-divider type="vertical"/>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
@ -133,7 +136,7 @@ export default {
dataIndex: 'message' dataIndex: 'message'
}, },
{ {
title: '播报状态', title: '播报',
align: "center", align: "center",
dataIndex: 'status_dictText' dataIndex: 'status_dictText'
}, },
@ -223,7 +226,7 @@ export default {
onend: () => { onend: () => {
// console.log("End utterance"); // console.log("End utterance");
console.log("------------delete----------【" + mess + "】消息播报完成,删除该消息") console.log("------------delete----------【" + mess + "】消息播报完成,删除该消息")
this.updateMessageStatus(obj['id']); this.updateMessageStatus(obj['id'], 1);
}, },
// //
onresume: () => { onresume: () => {
@ -257,18 +260,25 @@ export default {
}) })
}, },
updateMessageStatus(id) { reSetStatus(id, ststus) {
this.updateMessageStatus(id, ststus);
// this.getMessageList();
this.loading = false
this.loadData();
},
updateMessageStatus(id, status) {
// console.log("" + id); // console.log("" + id);
let parma = { let parma = {
"id": id, "id": id,
"status": '1', "status": status,
} }
putAction(this.url.edit, parma).then((res) => { putAction(this.url.edit, parma).then((res) => {
if (res.success) { if (res.success) {
for (let i = 0; i < this.messageList.length; i++) { for (let i = 0; i < this.messageList.length; i++) {
if (this.messageList[i].id === id) { if (this.messageList[i].id === id) {
//datasource //datasource
this.messageList.splice(i, 1); this.messageList.splice(i, '1');
} }
} }
} else { } else {
@ -288,7 +298,7 @@ export default {
console.log("--------timer is exec,the current time:" + new Date().toLocaleString()) console.log("--------timer is exec,the current time:" + new Date().toLocaleString())
this.getMessageList(); this.getMessageList();
} else { } else {
console.log("-------上次消息列表未处理完---HOLD DOWN") console.log("-------上次消息列表未处理完---HOLD ON")
} }
}, this.millisec) }, this.millisec)
}, },

@ -84,7 +84,6 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
private OrderGoodsAccessoriesMapper zyOrderGoodsAccessoriesMapper; private OrderGoodsAccessoriesMapper zyOrderGoodsAccessoriesMapper;
//顾客地址表 //顾客地址表
@Autowired @Autowired
CustomerReceivingAddressMapper customerReceivingAddressMapper; CustomerReceivingAddressMapper customerReceivingAddressMapper;
@ -98,10 +97,9 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
private ZySpeechMessageMapper zySpeechMessageMapper; private ZySpeechMessageMapper zySpeechMessageMapper;
/** /**
* 大屏数据-获取订单的状态 * 大屏数据-获取订单的状态
*
* @return * @return
*/ */
@Override @Override
@ -131,6 +129,7 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
/** /**
* 大屏数据-获取历史订单 * 大屏数据-获取历史订单
*
* @return * @return
*/ */
@Override @Override
@ -145,6 +144,7 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
/** /**
* 获取今日订单及七日订单 * 获取今日订单及七日订单
*
* @return * @return
*/ */
@Override @Override
@ -158,7 +158,6 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
} }
/** /**
*
* @param zyOrdersJk * @param zyOrdersJk
* @param orderGoodsJkList * @param orderGoodsJkList
* @return * @return
@ -168,10 +167,10 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
Double actual_payment = 0.00; Double actual_payment = 0.00;
Double money = 0.00; Double money = 0.00;
for(int i = 0 ; i < orderGoodsJkList.size() ; i++){ for (int i = 0; i < orderGoodsJkList.size(); i++) {
ZyGoods zyGoods = zyGoodsMapper.selectById(orderGoodsJkList.get(i).getGoodsId()); ZyGoods zyGoods = zyGoodsMapper.selectById(orderGoodsJkList.get(i).getGoodsId());
money = money + zyGoods.getUnitPrice()*orderGoodsJkList.get(i).getGoodsNum(); money = money + zyGoods.getUnitPrice() * orderGoodsJkList.get(i).getGoodsNum();
actual_payment = actual_payment + zyGoods.getPromotionPrice()*orderGoodsJkList.get(i).getGoodsNum(); actual_payment = actual_payment + zyGoods.getPromotionPrice() * orderGoodsJkList.get(i).getGoodsNum();
} }
ZyOrders zyOrders = new ZyOrders(); ZyOrders zyOrders = new ZyOrders();
zyOrders.setIschild(0); zyOrders.setIschild(0);
@ -179,15 +178,14 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
zyOrders.setOrdersNum(getOrdersNum()); zyOrders.setOrdersNum(getOrdersNum());
zyOrders.setMoney(money); zyOrders.setMoney(money);
zyOrders.setFreight(zyOrdersJk.getFreight()); zyOrders.setFreight(zyOrdersJk.getFreight());
zyOrders.setPromotionPrice(money-actual_payment); zyOrders.setPromotionPrice(money - actual_payment);
zyOrders.setActualPayment(actual_payment); zyOrders.setActualPayment(actual_payment);
zyOrders.setDeliveryTime(zyOrdersJk.getDeliveryTime()); zyOrders.setDeliveryTime(zyOrdersJk.getDeliveryTime());
zyOrders.setOrdersType(zyOrdersJk.getOrdersType()); zyOrders.setOrdersType(zyOrdersJk.getOrdersType());
zyOrders.setUserId(zyOrdersJk.getUserId()); zyOrders.setUserId(zyOrdersJk.getUserId());
zyOrders.setGoodsQuantity(zyOrdersJk.getGoodsQuantity()); zyOrders.setGoodsQuantity(zyOrdersJk.getGoodsQuantity());
//顾客地址 //顾客地址
if(zyOrdersJk.getAddressId()!=null&&zyOrdersJk.getAddressId()!="") if (zyOrdersJk.getAddressId() != null && zyOrdersJk.getAddressId() != "") {
{
CustomerReceivingAddress customerReceivingAddress = customerReceivingAddressMapper.selectById(zyOrdersJk.getAddressId()); CustomerReceivingAddress customerReceivingAddress = customerReceivingAddressMapper.selectById(zyOrdersJk.getAddressId());
zyOrders.setCityId(customerReceivingAddress.getCityId()); zyOrders.setCityId(customerReceivingAddress.getCityId());
zyOrders.setAddress(customerReceivingAddress.getAddress()); zyOrders.setAddress(customerReceivingAddress.getAddress());
@ -197,8 +195,7 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
} }
//顾客发票 //顾客发票
if(zyOrdersJk.getInvoiceId()!=null&&zyOrdersJk.getInvoiceId()!="") if (zyOrdersJk.getInvoiceId() != null && zyOrdersJk.getInvoiceId() != "") {
{
CustomerInvoice customerInvoice = customerInvoiceMapper.selectById(zyOrdersJk.getInvoiceId()); CustomerInvoice customerInvoice = customerInvoiceMapper.selectById(zyOrdersJk.getInvoiceId());
zyOrders.setInvoiceCustomerType(Integer.parseInt(customerInvoice.getCustomerType())); zyOrders.setInvoiceCustomerType(Integer.parseInt(customerInvoice.getCustomerType()));
zyOrders.setInvoiceType(Integer.parseInt(customerInvoice.getInvoiceType())); zyOrders.setInvoiceType(Integer.parseInt(customerInvoice.getInvoiceType()));
@ -216,7 +213,7 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
zyOrders.setPaymentStatus(1); zyOrders.setPaymentStatus(1);
zyOrders.setPaymentTime(new Date()); zyOrders.setPaymentTime(new Date());
baseMapper.insert(zyOrders); baseMapper.insert(zyOrders);
for(int j = 0 ; j < orderGoodsJkList.size() ; j++){ for (int j = 0; j < orderGoodsJkList.size(); j++) {
ZyGoods zyGoods = zyGoodsMapper.selectById(orderGoodsJkList.get(j).getGoodsId()); ZyGoods zyGoods = zyGoodsMapper.selectById(orderGoodsJkList.get(j).getGoodsId());
OrderGoods orderGoods = new OrderGoods(); OrderGoods orderGoods = new OrderGoods();
orderGoods.setOrdersId(zyOrders.getId()); orderGoods.setOrdersId(zyOrders.getId());
@ -241,15 +238,15 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
orderGoods.setRecommend(zyGoods.getRecommend()); orderGoods.setRecommend(zyGoods.getRecommend());
orderGoods.setPlaceOrigin(zyGoods.getPlaceOrigin()); orderGoods.setPlaceOrigin(zyGoods.getPlaceOrigin());
orderGoods.setStatus(zyGoods.getStatus()); orderGoods.setStatus(zyGoods.getStatus());
orderGoods.setTotalPrice(zyGoods.getUnitPrice()*orderGoodsJkList.get(j).getGoodsNum()); orderGoods.setTotalPrice(zyGoods.getUnitPrice() * orderGoodsJkList.get(j).getGoodsNum());
orderGoods.setPayTotalPrice(zyGoods.getPromotionPrice()*orderGoodsJkList.get(j).getGoodsNum()); orderGoods.setPayTotalPrice(zyGoods.getPromotionPrice() * orderGoodsJkList.get(j).getGoodsNum());
zyOrderGoodsMapper.insert(orderGoods); zyOrderGoodsMapper.insert(orderGoods);
GoodsModule goodsModule = new GoodsModule(); GoodsModule goodsModule = new GoodsModule();
QueryWrapper<GoodsModule> queryWrapperzsm = new QueryWrapper(); QueryWrapper<GoodsModule> queryWrapperzsm = new QueryWrapper();
queryWrapperzsm.eq("goods_id",zyGoods.getId()); queryWrapperzsm.eq("goods_id", zyGoods.getId());
queryWrapperzsm.eq("style_id",zyGoods.getStyleId()); queryWrapperzsm.eq("style_id", zyGoods.getStyleId());
List<GoodsModule> listzsm = zyGoodsModuleMapper.selectList(queryWrapperzsm); List<GoodsModule> listzsm = zyGoodsModuleMapper.selectList(queryWrapperzsm);
for (int k = 0 ; k < listzsm.size() ; k++){ for (int k = 0; k < listzsm.size(); k++) {
OrderGoodsModule orderGoodsModule = new OrderGoodsModule(); OrderGoodsModule orderGoodsModule = new OrderGoodsModule();
orderGoodsModule.setOrderGoodsId(orderGoods.getId()); orderGoodsModule.setOrderGoodsId(orderGoods.getId());
orderGoodsModule.setGoodsId(zyGoods.getId()); orderGoodsModule.setGoodsId(zyGoods.getId());
@ -259,10 +256,10 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
zyOrderGoodsModuleMapper.insert(orderGoodsModule); zyOrderGoodsModuleMapper.insert(orderGoodsModule);
} }
GoodsFabric goodsFabric = new GoodsFabric(); GoodsFabric goodsFabric = new GoodsFabric();
QueryWrapper<GoodsFabric> queryWrapperzsf =new QueryWrapper(); QueryWrapper<GoodsFabric> queryWrapperzsf = new QueryWrapper();
queryWrapperzsf.eq("goods_id",zyGoods.getId()); queryWrapperzsf.eq("goods_id", zyGoods.getId());
List<GoodsFabric> listzsf = zyGoodsFabricMapper.selectList(queryWrapperzsf); List<GoodsFabric> listzsf = zyGoodsFabricMapper.selectList(queryWrapperzsf);
for (int o = 0 ; o < listzsf.size() ; o++){ for (int o = 0; o < listzsf.size(); o++) {
OrderGoodsFabric orderGoodsFabric = new OrderGoodsFabric(); OrderGoodsFabric orderGoodsFabric = new OrderGoodsFabric();
orderGoodsFabric.setOrderGoodsId(orderGoods.getId()); orderGoodsFabric.setOrderGoodsId(orderGoods.getId());
orderGoodsFabric.setGoodsId(zyGoods.getId()); orderGoodsFabric.setGoodsId(zyGoods.getId());
@ -271,9 +268,9 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
} }
GoodsAccessories goodsAccessories = new GoodsAccessories(); GoodsAccessories goodsAccessories = new GoodsAccessories();
QueryWrapper<GoodsAccessories> queryWrapperzsa = new QueryWrapper(); QueryWrapper<GoodsAccessories> queryWrapperzsa = new QueryWrapper();
queryWrapperzsa.eq("goods_id",zyGoods.getId()); queryWrapperzsa.eq("goods_id", zyGoods.getId());
List<GoodsAccessories> listzsa = zyGoodsAccessoriesMapper.selectList(queryWrapperzsa); List<GoodsAccessories> listzsa = zyGoodsAccessoriesMapper.selectList(queryWrapperzsa);
for (int p = 0 ; p < listzsa.size() ; p++){ for (int p = 0; p < listzsa.size(); p++) {
OrderGoodsAccessories orderGoodsAccessories = new OrderGoodsAccessories(); OrderGoodsAccessories orderGoodsAccessories = new OrderGoodsAccessories();
orderGoodsAccessories.setOrderGoodsId(orderGoods.getId()); orderGoodsAccessories.setOrderGoodsId(orderGoods.getId());
orderGoodsAccessories.setGoodsId(zyGoods.getId()); orderGoodsAccessories.setGoodsId(zyGoods.getId());
@ -286,18 +283,18 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
List<String> ids = new ArrayList<>(); List<String> ids = new ArrayList<>();
ZyOrders zos = new ZyOrders(); ZyOrders zos = new ZyOrders();
QueryWrapper<ZyOrders> queryWrapperzos = new QueryWrapper(); QueryWrapper<ZyOrders> queryWrapperzos = new QueryWrapper();
queryWrapperzos.eq("order_id",zyOrders.getId()); queryWrapperzos.eq("order_id", zyOrders.getId());
List<ZyOrders> listzos = baseMapper.selectList(queryWrapperzos); List<ZyOrders> listzos = baseMapper.selectList(queryWrapperzos);
if(listzos.size()>0){ if (listzos.size() > 0) {
//return Result.error("该订单已经拆分,不可以再次拆单!"); //return Result.error("该订单已经拆分,不可以再次拆单!");
return null; return null;
}else{ } else {
OrderGoods orderGoods = new OrderGoods(); OrderGoods orderGoods = new OrderGoods();
QueryWrapper<OrderGoods> queryWrapperog = new QueryWrapper(); QueryWrapper<OrderGoods> queryWrapperog = new QueryWrapper();
queryWrapperog.eq("orders_id",zyOrders.getId()); queryWrapperog.eq("orders_id", zyOrders.getId());
List<OrderGoods> listog = zyOrderGoodsMapper.selectList(queryWrapperog); List<OrderGoods> listog = zyOrderGoodsMapper.selectList(queryWrapperog);
if(listog.size()>0){ if (listog.size() > 0) {
for (int i = 0 ; i < listog.size() ; i++){ for (int i = 0; i < listog.size(); i++) {
ZyOrders zo = new ZyOrders(); ZyOrders zo = new ZyOrders();
zo = zyOrders; zo = zyOrders;
zo.setId(null); zo.setId(null);
@ -317,7 +314,7 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
og.setOrdersId(zo.getId()); og.setOrdersId(zo.getId());
zyOrderGoodsMapper.updateById(og); zyOrderGoodsMapper.updateById(og);
//定时播报 //定时播报
ZySpeechMessage message=new ZySpeechMessage(); ZySpeechMessage message = new ZySpeechMessage();
//订单商品id //订单商品id
message.setOrdergoodsId(zo.getId()); message.setOrdergoodsId(zo.getId());
// //工单id // //工单id
@ -325,7 +322,9 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
// //生产计划工序id // //生产计划工序id
// message.setZyplanprocessId(); // message.setZyplanprocessId();
//消息 //消息
message.setMessage("您有新的订单,订单编号:"+zo.getOrdersNum()+",请及时查看!"); String ordersNum = zo.getOrdersNum();
String code = ordersNum.substring(ordersNum.length() - 6);
message.setMessage("您有新的订单,订单尾号:" + code + ",请及时查看!");
zySpeechMessageMapper.insert(message); zySpeechMessageMapper.insert(message);
} }
} }
@ -342,13 +341,13 @@ public class ZyOrdersServiceImpl extends ServiceImpl<ZyOrdersMapper, ZyOrders> i
*/ */
public String getOrdersNum() { public String getOrdersNum() {
String mrstr = "000000000000000000"; String mrstr = "000000000000000000";
QueryWrapper<ZyOrders> qw=new QueryWrapper(); QueryWrapper<ZyOrders> qw = new QueryWrapper();
int listsize = baseMapper.selectCount(qw); int listsize = baseMapper.selectCount(qw);
int strsize = listsize+1; int strsize = listsize + 1;
String str = strsize+""; String str = strsize + "";
int strlength = str.length(); int strlength = str.length();
String substr = mrstr.substring(0,mrstr.length()-strlength); String substr = mrstr.substring(0, mrstr.length() - strlength);
String OrdersNum = substr+str; String OrdersNum = substr + str;
return OrdersNum; return OrdersNum;
} }

@ -99,7 +99,7 @@ public class ZyProductPlanController extends JeecgController<ZyProductPlan, IZyP
//保存生产计划语音播报消息 //保存生产计划语音播报消息
ZySpeechMessage zySpeechMessage = new ZySpeechMessage(); ZySpeechMessage zySpeechMessage = new ZySpeechMessage();
String productCode = zyProductPlan.getProductCode(); String productCode = zyProductPlan.getProductCode();
String code = productCode.substring(productCode.length() - 10); String code = productCode.substring(productCode.length() - 6);
String mess = "工单尾号" + code + ",生产计划已完成制定,请跟进后续生产作业."; String mess = "工单尾号" + code + ",生产计划已完成制定,请跟进后续生产作业.";
zySpeechMessage.setMessage(mess); zySpeechMessage.setMessage(mess);
zySpeechMessage.setWorkorderId(productCode); zySpeechMessage.setWorkorderId(productCode);

@ -9,9 +9,10 @@ import org.jeecg.modules.demo.pro.entity.ZyProcessMachine;
import org.jeecg.modules.demo.pro.service.IZyProcessMachineService; import org.jeecg.modules.demo.pro.service.IZyProcessMachineService;
import org.jeecg.modules.device.entity.ZyDevice; import org.jeecg.modules.device.entity.ZyDevice;
import org.jeecg.modules.device.service.IZyDeviceService; import org.jeecg.modules.device.service.IZyDeviceService;
import org.jeecg.modules.message.entity.ZySpeechMessage;
import org.jeecg.modules.message.service.IZySpeechMessageService;
import org.jeecg.modules.operationtool.entity.ZyOperationtool; import org.jeecg.modules.operationtool.entity.ZyOperationtool;
import org.jeecg.modules.operationtool.service.IZyOperationtoolService; import org.jeecg.modules.operationtool.service.IZyOperationtoolService;
import org.jeecg.modules.person.vo.station;
import org.jeecg.modules.productplan.entity.ZyPlanProcess; import org.jeecg.modules.productplan.entity.ZyPlanProcess;
import org.jeecg.modules.productplan.entity.ZyPlanProcessAccessories; import org.jeecg.modules.productplan.entity.ZyPlanProcessAccessories;
import org.jeecg.modules.productplan.entity.ZyPlanProcessFabric; import org.jeecg.modules.productplan.entity.ZyPlanProcessFabric;
@ -311,7 +312,7 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
Optional.ofNullable(planProcessList).orElse(new LinkedList<>()).forEach(e -> { Optional.ofNullable(planProcessList).orElse(new LinkedList<>()).forEach(e -> {
// 5,生成物料单 // 5,生成物料单
zyPlanProcessService.createMaterialBill(e); zyPlanProcessService.createMaterialBill(e);
// 5,发送到仓库 // 6,发送到仓库
zyPlanProcessService.sendToRepository(e); zyPlanProcessService.sendToRepository(e);
}); });
@ -320,10 +321,27 @@ public class IZyProductPlanAutoServiceImpl extends ServiceImpl<ZyProductPlanMapp
//测试需要返回生产计划工序 //测试需要返回生产计划工序
returnList.add(map); returnList.add(map);
} }
// 7,保存生产计划语音消息
this.addSpeechMessage(k);
}); });
return returnList; return returnList;
} }
@Autowired
private IZySpeechMessageService iZySpeechMessageService;
@Transactional(rollbackFor = Exception.class, readOnly = false)
public void addSpeechMessage(final ZyProductPlan zyProductPlan) {
//保存生产计划语音播报消息
ZySpeechMessage zySpeechMessage = new ZySpeechMessage();
String productCode = zyProductPlan.getProductCode();
String code = productCode.substring(productCode.length() - 6);
String mess = "工单尾号" + code + ",生产计划已完成制定,请跟进后续生产作业.";
zySpeechMessage.setMessage(mess);
zySpeechMessage.setWorkorderId(productCode);
iZySpeechMessageService.save(zySpeechMessage);
}
/** /**
* 匹配设备&工具&工人 * 匹配设备&工具&工人
* <p> * <p>

@ -258,7 +258,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
//订单商品id //订单商品id
message.setWorkorderId(workOrder.getId()); message.setWorkorderId(workOrder.getId());
//消息 //消息
message.setMessage("您的工单已生成,工单编号:"+workOrder.getProductCode()+",请及时查看!"); String productCode = workOrder.getProductCode();
String code = productCode.substring(productCode.length() - 6);
message.setMessage("您的工单已生成,工单尾号:"+code+",请及时查看!");
zySpeechMessageMapper.insert(message); zySpeechMessageMapper.insert(message);
//保存产品 //保存产品

Loading…
Cancel
Save