Abhol/Zustellservice
- Bitte bei der Benutzerverwaltung
alter table person add collectdeliverDistance int(11);
einblenden mit:
[checkbox] Ich möchte beim Zustell und Lieferservice mitmachen. wenn checkbox da: Meine max. Distanz der Abholung oder Zustellung ist: collectdeliverDistance
wenn collectdeliverDistance gesetzt ist dann wird automatisch die checkbox gesetzt. bei uncheck der checkbox kommt NULL in collectdeliverDistance
- Bitte bei https://www.mygood.at/de/shop oben vor der Produktsuche eine eigene Liste anzeigen: "Mitnahme/Abhol/Lieferservice", die Liste dazu bekommst du aus einer Funktion:
CREATE DEFINER=`root`@`localhost` PROCEDURE `searchUserCollectDeliver`(json MEDIUMTEXT,OUT json_return MEDIUMTEXT)
json-input: userid
mit json_return als:
[{"cds_seq_id":xy,"opd_seq_id":xy,"fromLocation":{"text":xy,"lat":lat,"lng":lng},"toLocation":{"text":xy,"lat":lat,"lng":lng},"status":"text"},..]
status .. OPEN,EXECUTE,READY
Darstellung in der Liste von "fromLocation.text und toLocation.text" und ein Button "Übernehme Fahrt" wenn der status "OPEN" ist. Darstellung in der Liste von "fromLocation.text und toLocation.text" und ein 2 Buttons "Breche Fahrt vor Antritt ab" und "Fahrt abgeschlossen" wenn der status "EXECUTE" ist. Darstellung von "Danke für die Fahrt" wenn der status "READY" ist.
bei "Übernehme Fahrt" wird die Funktion makeCollectDeliver(json MEDIUMTEXT,OUT json_return MEDIUMTEXT) aufgerufen und die userid,cds_seq_id,opd_seq_id und status "EXECUTE" übergeben.
bei "Breche Fahrt vor Antritt ab" wird die Funktion makeCollectDeliver(json MEDIUMTEXT,OUT json_return MEDIUMTEXT) aufgerufen und die userid,cds_seq_id,opd_seq_id und status "CANCEL" übergeben.
bei "Fahrt abgeschlossen" wird die Funktion makeCollectDeliver(json MEDIUMTEXT,OUT json_return MEDIUMTEXT) aufgerufen und die userid,cds_seq_id,opd_seq_id und status "READY" übergeben.
- Bitte das searchUserCollectDeliver periodisch jede Minute aufrufen um die aktuelle Liste zu holen
DB Modell-Teil:
DELIMITER ;
alter table person add collectdeliverDistance int(11);
#
alter table collective_distribution add FOREIGN KEY (fdelivery_near_cdp_seq_id) REFERENCES coll_dist_product(seq_id);
alter table collective_distribution add FOREIGN KEY (fdelivery_regi_cdp_seq_id) REFERENCES coll_dist_productseq_id);
alter table collective_distribution add FOREIGN KEY (fdelivery_nati_cdp_seq_id) REFERENCES coll_dist_product(seq_id);
alter table collective_distribution add FOREIGN KEY (fdelivery_inte_cdp_seq_id) REFERENCES coll_dist_product(seq_id);
#
CREATE TABLE collectdeliverService (
seq_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
fperson_contact_seq_id INT NOT NULL,
# der die Fahrt übernimmt
fopd_seq_id INT NOT NULL,
# die übernommene Bestellung aus order_product_details
statustype VARCHAR(10) NOT NULL,
# EXECUTE,READY
createdAt datetime,
updatedAt datetime,
FOREIGN KEY (fperson_contact_seq_id) REFERENCES person(seq_id),
FOREIGN KEY (fopd_seq_id) REFERENCES order_product_details(seq_id)
);
ALTER TABLE `azeero`.`collectdeliverService` ADD UNIQUE INDEX `collectdeliverService_u1` (`fopd_seq_id`, `statustype`);
#
DELIMITER $$
DROP procedure IF EXISTS `searchUserCollectDeliver` $$
USE `azeero`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `searchUserCollectDeliver`(json MEDIUMTEXT,OUT json_return MEDIUMTEXT)
ThisSP:BEGIN
DECLARE pos INT DEFAULT NULL;
DECLARE json_text MEDIUMTEXT;
#
DECLARE finished INTEGER DEFAULT 0;
DECLARE cursor_dist CURSOR FOR
SELECT
CONCAT(
'{"cds_seq_id":',IFNULL(cds.seq_id,-1),',',
'"opd_seq_id":',opd.seq_id,',',
'"fromLocation":{"name":"',cd.name,' ',cd.address,'",",lat:"',cd.lat,',"lng":',cd.lng,'},',
'"toLocation":{"name":"',p.surname,' ',p.address,'",",lat:"',p.lat,',"lng":',p.lng,'},',
'"status":"',IFNULL(cds.statustype,'OPEN'),'"',
'}') json
# status .. OPEN,EXECUTE,READY
FROM order_product_details opd LEFT JOIN collectdeliverService cds ON cds.fopd_seq_id = opd.seq_id,collective_distribution cd,person p
WHERE opd.sum_order_status_kz = 'ABH'
AND odp.fcollective_distribution_seq_id = cd.seq_id
AND EXISTS (
# Nahe Zustellung gewählt
SELECT 1 FROM order_products op, coll_dist_product cdp
WHERE cd.fdelivery_near_cdp_seq_id = cdp.seq_id
AND cdp.fproduct_seq_id = op.fproduct_seq_id
AND op.forder_product_details = opd.seq_id
)
AND p.seq_id = @userid
AND round(azeero_distance(p.lat,p.lng,cd.lat,cd.lng),2) < IFNULL(p.collectdeliverDistance,0)
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
#
DECLARE exit handler for sqlexception, sqlwarning
BEGIN
GET DIAGNOSTICS CONDITION 1 @error = MESSAGE_TEXT;
SET json_return = CONCAT('{"error":"',@error,'","json":"',json,'"pos":"',pos,'}');
ROLLBACK;
END;
#
SET @userid = (SELECT CONVERT(JSON_EXTRACT(json, "$.userid"),SIGNED));
#
IF (@userid < 1) THEN
LEAVE ThisSP;
END IF;
#
SET json_return = '[';
OPEN cursor_dist;
cursor_dist_loop: LOOP
FETCH cursor_dist INTO json_text;
SET json_return = CONCAT(json_return,',',json_text);
IF finished = 1 THEN
LEAVE cursor_dist_loop;
END IF;
END LOOP cursor_dist_loop;
CLOSE cursor_dist;
SET json_return = CONCAT(json_return,']');
#
END$$
DELIMITER ;
DROP procedure IF EXISTS `makeCollectDeliver`;
DELIMITER $$
USE `azeero`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `makeCollectDeliver`(json MEDIUMTEXT,OUT json_return MEDIUMTEXT)
ThisSP:BEGIN
DECLARE pos INT DEFAULT NULL;
#
DECLARE exit handler for sqlexception, sqlwarning
BEGIN
GET DIAGNOSTICS CONDITION 1 @error = MESSAGE_TEXT;
SET json_return = CONCAT('{"error":"',@error,'","json":"',json,'"pos":"',pos,'}');
ROLLBACK;
END;
#
SET @userid = (SELECT CONVERT(JSON_EXTRACT(json, "$.userid"),SIGNED));
SET @status = (SELECT JSON_UNQUOTE(JSON_EXTRACT(json, "$.status")));
#EXECUTE,CANCEL,READY
SET @cds_seq_id = (SELECT CONVERT(JSON_EXTRACT(json, "$.cds_seq_id"),SIGNED));
SET @opd_seq_id = (SELECT CONVERT(JSON_EXTRACT(json, "$.opd_seq_id"),UNSIGNED));
#
IF (@userid < 1) THEN
LEAVE ThisSP;
END IF;
#
CALL START_TRANSACTION(@userid);
IF (@cds_seq_id = -1) THEN
SET pos = 1;
INSERT INTO collectdeliverService (
fperson_contact_seq_id,
# der die Fahrt übernimmt
fopd_seq_id,
# die übernommene Bestellung aus order_product_details
statustype,
# EXECUTE,READY
createdAt
) VALUES (
@userid,
@opd_seq_id,
'EXECUTE',
NOW()
)
;
ELSEIF @status = 'CANCEL' THEN
SET pos = 2;
DELETE FROM collectdeliverService WHERE fperson_contact_seq_id = @userid AND fopd_seq_id = @opd_seq_id
;
ELSEIF @status = 'READY' THEN
SET pos = 3;
UPDATE collectdeliverService set statustype = 'READY' WHERE fperson_contact_seq_id = @userid AND fopd_seq_id = @opd_seq_id
;
END IF;
SET json_return = CONCAT('{"status":"OK"}');
CALL DO_COMMIT;
END$$
DELIMITER ;